티스토리 뷰

brief solution.

1. Whenever you train your model. You must check if your model and input data both are on the same device. (cpu or cuda)
2. And you must check the input data type and model parameters' data type are same

 

 

Input type은 torch.FloatTensor인데 weight type(model parameter)는 torch.DoubleTensor라서 나타나는 에러라고 생각된다. 

for epoch in range(train_epoch+1):
    model.train()

    for i, (v_d, v_p, label) in enumerate(train_generator):
        v_d = v_d.float().to(device)
        v_p = v_p.float().to(device)
        
        score = model(v_d, v_p)
        label = Variable(torch.from_numpy(label).float()).to(device)

        n = torch.squeeze(sigmoid(score), 1)

        loss = loss_fn(n, label)
        train_loss_history.append(loss)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        
 ...

보통 모델에 학습하기 전 데이터를 float타입으로 변경해준다. 따라서 나의 Input type은 torch.FloatTensor이다.

그러나 내가 만든 model은 double 타입이었다. 따라서 input되는 값과 model의 parameter간의 type이 맞지 않아서 계산이 불가능하다고 생각한다.

class CNN_RNN(nn.Module):
    def __init__(self, encoding, **config):
        super(CNN_RNN, self).__init__()
        ...
        self.conv = nn.ModuleList([nn.Conv1d(in_channels=in_ch[i],
                                             out_channels=in_ch[i+1],
                                             kernel_size = kernels[i]) for i in range(layer_size)])
        self.conv = self.conv.double()
      
        ...
        self.direction = 2 if config['rnn_drug_bidirectional'] else 1
        self.rnn = self.rnn.double()

...

 

문제는 이부분이었다.

    def forward(self, v):
        # 1. CNN 
        for layer in self.conv:
            v = F.relu(layer(v))

해당 부분에서 input인 v를 double type으로 바꿔주지 않았기 때문에 실행되지 않았다. 

    def forward(self, v):
        # 1. CNN 
        for layer in self.conv:
            v = F.relu(layer(v.double()))

해당 부분의 input인 v를 v.double()형태로 변경해주니 해결되었다.

댓글