我正在尝试构建神经网络,但是我不知道最大池化层出了什么问题。
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。
答案 0 :(得分:0)
您使用torch.max
返回两个输出:沿dim = 0的最大值和沿该维度的 argmax 。因此,您只需要选择第一个输出。 (您可能要考虑使用adaptive max pooling来完成此任务)。
您的线性层期望其输入具有暗64(即batch_size
乘64
形张量)。但是,看来您的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。