将张量传递到线性层时遇到问题-Pytorch

时间:2019-03-07 09:34:40

标签: python neural-network pytorch

我正在尝试构建神经网络,但是我不知道最大池化层出了什么问题。

    self.embed1 = nn.Embedding(256, 8)
    self.conv_1 = nn.Conv2d(1, 64, (7,8), padding = (0,0))
    self.fc1 = nn.Linear(64, 2)

def forward(self,x):

    import pdb; pdb.set_trace()
    x = self.embed1(x) #input a tensor of ([1,217]) output size: ([1, 217, 8]) 
    x = x.unsqueeze(0) #conv lay needs a tensor of size (B x C x W x H) so unsqueeze here to make ([1, 1, 217, 8])
    x = self.conv_1(x) #creates 64 filter of size (7, 8).Outputs ([1, 64, 211, 1]) as 6 values lost due to not padding. 

    x = torch.max(x,0) #returning max over the 64 columns. This returns a tuple of length 2 with 64 values in each att, the max val and indices.
    x = x[0] #I only need the max values. This returns a tensor of size ([64, 211, 1])
    x = x.squeeze(2) #linear layer only wants the number of inputs and number of outputs so I squeeze the tensor to ([64, 211])
    x = self.fc1(x) #Error Size mismatch (M1: [64 x 211] M2: [64 x 2])

我理解为什么线性层不接受211,但是我不明白为什么在列上最大化后我的张量不是64 x 2。

3 个答案:

答案 0 :(得分:0)

您使用torch.max返回两个输出:沿dim = 0的最大值和沿该维度的 argmax 。因此,您只需要选择第一个输出。 (您可能要考虑使用adaptive max pooling来完成此任务)。

您的线性层期望其输入具有暗64(即batch_size64形张量)。但是,看来您的x[0]的形状为13504 x 1-绝对不是64。

例如,请参见this thread

答案 1 :(得分:0)

如果我猜对了您的意图,那么您的错误是您使用torch.max进行了2d maxpooling,而不是torch.nn.functional.max_pool2d。前者在张量维度上减小(例如,在 all 特征图或 all 水平线上),而后者在from netCDF4 import Dataset import scipy.io for ncfilename in ncfilenamelist: dataset = Dataset(ncfilename, "r", format="NETCDF4") with open('mytable.mat', 'ab') as f: numpyrow = dataset['v'][0][:,0,0] # A (1x24) array of float32 scipy.io.savemat(f, mdict={'mattable':numpyrow}) 的每个正方形空间邻域中减小[h, w]张量的平面。

答案 2 :(得分:0)

代替此:

  x = x.squeeze(2)

您可以改为:

  x = x.view(-1, 64) # view will now correctly resize it to [64 x 2]

您可以将视图视为numpy重塑。我们使用-1表示我们不知道要多少行,但是知道有多少列,即64。