簡體   English   中英

如何使用 Pytorch 摘要解決此錯誤?

[英]How can i solve this error with Pytorch summary?

我正在嘗試使用以下方法加載 DNN pytorch 模型:

from torch import nn
import torch.nn.functional as F

class myDNN(nn.Module):  
  def __init__(self):
    super(myDNN, self).__init__()

    # layers definition

    # first convolutional block
    self.conv1 = nn.Conv1d(in_channels=2, out_channels=8, kernel_size=7) 
    self.pool1 = nn.MaxPool1d(kernel_size = 2, stride=2) 

    # second convolutional block
    self.conv2 = nn.Conv1d(in_channels=8, out_channels=16, kernel_size=3) 
    self.pool2 = nn.MaxPool1d(kernel_size = 2, stride=2) 

    # third convolutional block
    self.conv3 = nn.Conv1d(in_channels=16, out_channels=32, kernel_size=3) 
    self.pool3 = nn.MaxPool1d(kernel_size = 2, stride=2) 

    # fourth convolutional block
    self.conv4 = nn.Conv1d(in_channels=32, out_channels=64, kernel_size=3) 
    self.pool4 = nn.MaxPool1d(kernel_size = 2, stride=2) 

    # fifth convolutional block
    self.conv5 = nn.Conv1d(in_channels=64, out_channels=128, kernel_size=3) 
    self.pool5 = nn.MaxPool1d(kernel_size = 2, stride=2) 

    
    self.flatten = nn.Flatten() 
    self.drop1 = nn.Dropout(p=0.5) 
    self.fc1 = nn.Linear(in_features=3200, out_features=50) #3200 is a random number, 
    probably wrong
    self.drop2 = nn.Dropout(p=0.5) #dropout 
    self.fc2 = nn.Linear(in_features=50, out_features=25)
    self.fc3 = nn.Linear(in_features=25, out_features=2)


  def forward(self, x, y):  
    x = F.relu(self.conv1(x))  
    x = self.pool1(x)
    x = F.relu(self.conv2(x)) 
    x = self.pool2(x)
    x = F.relu(self.conv3(x))
    x = self.pool3(x)
    x = F.relu(self.conv4(x))
    x = self.pool3(x)
    x = F.relu(self.conv5(x))
    x = self.pool5(x)
    
    y = F.relu(self.conv1(y))  
    y = self.pool1(y)
    y = F.relu(self.conv2(y)) 
    y = self.pool2(y)
    y = F.relu(self.conv3(y))
    y = self.pool3(y)
    y = F.relu(self.conv4(y))
    y = self.pool3(y)
    y = F.relu(self.conv5(y))
    y = self.pool5(y)

    #flatten
    x = self.flatten(x)
    y = self.flatten(y)

    w = torch.cat(x,y,1) 
    
    w = self.drop1(w) #dropout layer
    w = F.relu(self.fc1(w)) #layer fully connected with re lu
    w = self.drop2(w)
    w = F.relu(self.fc2(w)) #layer fully connected with re lu 

    w = self.fc3(w) #layer fully connected
    out = F.log_softmax(w, dim=1) 

    return out

我試圖重現的 DNN 是本文中提到的 DNN:

https://iopscience.iop.org/article/10.1088/2399-6528/aa83fa/pdf

無論如何,當我加載 Pytorch 的摘要函數時,我不確定它是否正確:

model = myDNN()
print(model)

from torchsummary import summary
if torch.cuda.is_available():
  summary(model.cuda(), input_size = [(1,892),(1,492)])
else:
  summary(model, input_size = [(1,892),(1,492)])

但我收到此錯誤:

RuntimeError                              Traceback (most recent call last)
<ipython-input-123-6846b44c144c> in <module>()
      6 from torchsummary import summary
      7 if torch.cuda.is_available():
----> 8   summary(model.cuda(), input_size = [(1,892),(1,492)]) 
      9 else:
     10   summary(model, input_size = [(1,892),(1,492)])

5 frames
/usr/local/lib/python3.7/dist-packages/torch/nn/modules/conv.py in _conv_forward(self, input, weight, bias)
    297                             _single(0), self.dilation, self.groups)
    298         return F.conv1d(input, weight, bias, self.stride,
--> 299                         self.padding, self.dilation, self.groups)
    300 
    301     def forward(self, input: Tensor) -> Tensor:

RuntimeError: Given groups=1, weight of size [8, 2, 7], expected input[2, 1, 892] to have 2 channels, but got 1 channels instead

請任何幫助將不勝感激,謝謝

模型的第一層需要兩個通道而不是一個。 只需將正確的輸入形狀傳遞給“摘要”,如下所示:

summary(model, ((2, dim1),(2,dim2))

編輯:在前向函數中,我將按如下方式進行連接(如果兩個模型的輸入具有相同的形狀):

w = torch.cat([x,y], dim=1)
w = self.flatten(w)

編輯:這是使用正確實現的工作代碼

from torch import nn
import torch.nn.functional as F
import torch

class myDNN(nn.Module):
  def __init__(self):
    super(myDNN, self).__init__()

    # layers definition

    # first convolutional block
    self.path1_conv1 = nn.Conv1d(in_channels=2, out_channels=8, kernel_size=7)
    self.path1_pool1 = nn.MaxPool1d(kernel_size = 2, stride=2)

    # second convolutional block
    self.path1_conv2 = nn.Conv1d(in_channels=8, out_channels=16, kernel_size=3)
    self.path1_pool2 = nn.MaxPool1d(kernel_size = 2, stride=2)

    # third convolutional block
    self.path1_conv3 = nn.Conv1d(in_channels=16, out_channels=32, kernel_size=3)
    self.path1_pool3 = nn.MaxPool1d(kernel_size = 2, stride=2)

    # fourth convolutional block
    self.path1_conv4 = nn.Conv1d(in_channels=32, out_channels=64, kernel_size=3)
    self.path1_pool4 = nn.MaxPool1d(kernel_size = 2, stride=2)

    # fifth convolutional block
    self.path1_conv5 = nn.Conv1d(in_channels=64, out_channels=128, kernel_size=3)
    self.path1_pool5 = nn.MaxPool1d(kernel_size = 2, stride=2)

    self.path2_conv1 = nn.Conv1d(in_channels=2, out_channels=8, kernel_size=7)
    self.path2_pool1 = nn.MaxPool1d(kernel_size = 2, stride=2)

    # second convolutional block
    self.path2_conv2 = nn.Conv1d(in_channels=8, out_channels=16, kernel_size=3)
    self.path2_pool2 = nn.MaxPool1d(kernel_size = 2, stride=2)

    # third convolutional block
    self.path2_conv3 = nn.Conv1d(in_channels=16, out_channels=32, kernel_size=3)
    self.path2_pool3 = nn.MaxPool1d(kernel_size = 2, stride=2)

    # fourth convolutional block
    self.path2_conv4 = nn.Conv1d(in_channels=32, out_channels=64, kernel_size=3)
    self.path2_pool4 = nn.MaxPool1d(kernel_size = 2, stride=2)

    # fifth convolutional block
    self.path2_conv5 = nn.Conv1d(in_channels=64, out_channels=128, kernel_size=3)
    self.path2_pool5 = nn.MaxPool1d(kernel_size = 2, stride=2)


    self.flatten = nn.Flatten()
    self.drop1 = nn.Dropout(p=0.5)
    self.fc1 = nn.Linear(in_features=2048, out_features=50) #3200 is a random number,probably wrong
    self.drop2 = nn.Dropout(p=0.5) #dropout
    self.fc2 = nn.Linear(in_features=50, out_features=25)
    self.fc3 = nn.Linear(in_features=25, out_features=2)


  def forward(self, x, y):
    x = F.relu(self.path1_conv1(x))
    x = self.path1_pool1(x)
    x = F.relu(self.path1_conv2(x))
    x = self.path1_pool2(x)
    x = F.relu(self.path1_conv3(x))
    x = self.path1_pool3(x)
    x = F.relu(self.path1_conv4(x))
    x = self.path1_pool3(x)
    x = F.relu(self.path1_conv5(x))
    x = self.path1_pool5(x)

    y = F.relu(self.path2_conv1(y))
    y = self.path2_pool1(y)
    y = F.relu(self.path2_conv2(y))
    y = self.path2_pool2(y)
    y = F.relu(self.path2_conv3(y))
    y = self.path2_pool3(y)
    y = F.relu(self.path2_conv4(y))
    y = self.path2_pool3(y)
    y = F.relu(self.path2_conv5(y))
    y = self.path2_pool5(y)

    #flatten
    x = self.flatten(x)
    y = self.flatten(y)

    w = torch.cat([x,y],dim=1)
    print(w.shape)
    w = self.drop1(w) #dropout layer
    w = F.relu(self.fc1(w)) #layer fully connected with re lu
    w = self.drop2(w)
    w = F.relu(self.fc2(w)) #layer fully connected with re lu

    w = self.fc3(w) #layer fully connected
    out = F.log_softmax(w, dim=1)

    return out

def main():
    model = myDNN()
    print(model)
    from torchsummary import summary
    if torch.cuda.is_available():
        summary(model.cuda(), input_size = [(2,246),(2,447)])
    else:
        summary(model, input_size = [(2,246),(2,447)])
if __name__ == '__main__':
    main()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM