Missing arguments error when using tensorboard

I build my custom layer which acts like a rnn, but is has more states than a regular rnn cell. I’ke like to record the graph using tensorboard. The training is successful, and i don’t see error in my code, however, when i call writer.add_graph(mymodel,dataloader), it throws an error

File "/home/mypc/anaconda3/lib/python3.6/site-packages/torch/nn/modules/module.py", line 531, in _slow_forward
    result = self.forward(*input, **kwargs)
TypeError: forward() missing 1 required positional argument: 'state_6'"

Here is a minimal example to produce this error. This model just executes arbitrary operation, so it looks doesn’t make sense at all, please ignore this. But it reproduces the error.

import torch
import numpy as np
import random
import matplotlib.pyplot as plt
import utilities
import importlib
import matplotlib
from torch.utils.data import Dataset, DataLoader
from torch.utils.tensorboard import SummaryWriter

matplotlib.use('Qt5Agg')
# from tensorboardX import SummaryWriter


# parameters
input_size = 40
layer1_size = 100
layer2_size = 10
length = 200
batch_size = 16
epoch = 10

class RandPatternDataset(Dataset):
    """random pattern dataset"""

    def __init__(self,transform=None):
        self.dataset = np.random.rand(100,40,200).astype(np.float32)
        self.label = np.random.rand(100,10).astype(np.float32)
        self.transform = transform

    def __len__(self):
        return self.dataset.shape[0]

    def __getitem__(self, idx):
        if torch.is_tensor(idx):
            idx = idx.tolist()

        return self.dataset[idx],self.label[idx]

class custom_layer(torch.nn.Module):
    def __init__(self, input_size, layer_size, length):
        super().__init__()
        self.input_size = input_size
        self.layer_size = layer_size
        self.length = length
        self.batch_size = batch_size
        self.weight = torch.nn.Linear(input_size, layer_size, bias=True)

    def forward(self, inp, state_1, state_2, state_3, state_4, state_5, state_6):

        state_1 = state_1 * 0.1 + inp
        state_2 = state_2 * 0.1 + inp
        state_3 = state_1 + state_2
        state_4 = state_5*0.1
        state_5 = self.weight(state_3)
        state_6 = state_5*0.1
        out = state_5*0.1

        return out, state_1, state_2, state_3, state_4, state_5, state_6

rand_pattern = RandPatternDataset()
dataloader = DataLoader(rand_pattern, batch_size=batch_size, shuffle=True, drop_last=True)

torch.manual_seed(2)

spike_before_train = None
v_before_train = None

# define two layers
layer_1 = custom_layer(input_size, layer1_size, length)
layer_2 = custom_layer(layer1_size, layer2_size, length)

writer = SummaryWriter(log_dir="~/logdir")
for j in range(epoch):

    print(j)
    for i_batch, sample_batched in enumerate(dataloader):

        l1_s1 = torch.zeros([batch_size, input_size])
        l1_s2 = torch.zeros([batch_size, input_size])
        l1_s3 = torch.zeros([batch_size, input_size])
        l1_s4 = torch.zeros([batch_size, layer1_size])
        l1_s5 = torch.zeros([batch_size, layer1_size])
        l1_s6 = torch.zeros([batch_size, layer1_size])

        l2_s1 = torch.zeros([batch_size, layer1_size])
        l2_s2 = torch.zeros([batch_size, layer1_size])
        l2_s3 = torch.zeros([batch_size, layer1_size])
        l2_s4 = torch.zeros([batch_size, layer2_size])
        l2_s5 = torch.zeros([batch_size, layer2_size])
        l2_s6 = torch.zeros([batch_size, layer2_size])

        # loss
        criterion = torch.nn.MSELoss()

        # optimizer

        params = list(layer_1.parameters()) + list(layer_2.parameters())
        optimizer = torch.torch.optim.Adam(params, lr=0.0005, betas=(0.9, 0.999), eps=1e-08)

        x_train = sample_batched[0]
        target = sample_batched[1]

        # step computation
        for t in range(length):
            out1, l1_s1,l1_s2,l1_s3,l1_s4,l1_s5,l1_s6 = layer_1(x_train[:, :, t], l1_s1,l1_s2,l1_s3,l1_s4,l1_s5,l1_s6)

            out2, l2_s1,l2_s2,l2_s3,l2_s4,l2_s5,l2_s6 = layer_2(out1,l2_s1,l2_s2,l2_s3,l2_s4,l2_s5,l2_s6)

        layer_1.zero_grad()
        layer_2.zero_grad()

        loss = criterion(out2, target)

        loss.backward()

        print(loss)

        optimizer.step()

writer.add_graph(layer_2,dataloader)
writer.close()

I also tried another implementation. I created a new module, which is custom_model, and put layer_1, layer_2 and the computation inside the forward() of custom_model. it does the same thing as above code. it causes a different error:

  File "/home/mypc/anaconda3/lib/python3.6/site-packages/torch/nn/modules/module.py", line 531, in _slow_forward
    result = self.forward(*input, **kwargs)
TypeError: forward() takes 2 positional arguments but 7 were given

here is the implementation of custom_model

class custom_model(torch.nn.Module):
    def __init__(self):

        super(custom_model, self).__init__()

        self.length = length
        self.layer_1 = custom_layer(input_size, layer1_size, length)
        self.layer_2 = custom_layer(layer1_size, layer2_size, length)

    def forward(self, inp):
	
        l1_s1 = torch.zeros([batch_size, input_size])
        l1_s2 = torch.zeros([batch_size, input_size])
        l1_s3 = torch.zeros([batch_size, input_size])
        l1_s4 = torch.zeros([batch_size, layer1_size])
        l1_s5 = torch.zeros([batch_size, layer1_size])
        l1_s6 = torch.zeros([batch_size, layer1_size])

        l2_s1 = torch.zeros([batch_size, layer1_size])
        l2_s2 = torch.zeros([batch_size, layer1_size])
        l2_s3 = torch.zeros([batch_size, layer1_size])
        l2_s4 = torch.zeros([batch_size, layer2_size])
        l2_s5 = torch.zeros([batch_size, layer2_size])
        l2_s6 = torch.zeros([batch_size, layer2_size])

        for t in range(length):
            out1, l1_s1,l1_s2,l1_s3,l1_s4,l1_s5,l1_s6 = self.layer_1(inp[:, :, t], l1_s1,l1_s2,l1_s3,l1_s4,l1_s5,l1_s6)
            out2, l2_s1,l2_s2,l2_s3,l2_s4,l2_s5,l2_s6 = self.layer_2(out1,l2_s1,l2_s2,l2_s3,l2_s4,l2_s5,l2_s6)

        return  out2

mymodel = custom_model()
writer = SummaryWriter(log_dir="~/logdir")
for j in range(epoch):

    print(j)
    for i_batch, sample_batched in enumerate(dataloader):
        # loss
        criterion = torch.nn.MSELoss()
        # optimizer
        params = list(mymodel.parameters())
        optimizer = torch.torch.optim.Adam(params, lr=0.0005, betas=(0.9, 0.999), eps=1e-08)

        x_train = sample_batched[0]
        target = sample_batched[1]

        filtered_output = mymodel.forward(x_train)

        mymodel.zero_grad()

        loss = criterion(out2, target)

        loss.backward()
        print(loss)
        optimizer.step()

writer.add_graph(mymodel,dataloader)
writer.close()

I’m using pytorch 1.2.0, python 3.6.9, tensorboard 1.14.0

1 Like

same problem, any solution?