我知道这是因为形状与乘法不匹配,但为什么当我的代码与我发现的大多数示例代码相似时:
import torch.nn as nn
...
#input is a 256x256 image
num_input_channels = 3
self.encoder = nn.Sequential(
nn.Conv2d(num_input_channels*2**0, num_input_channels*2**1, kernel_size=3, padding=1, stride=2), #1 6 128 128
nn.Tanh(),
nn.Conv2d(num_input_channels*2**1, num_input_channels*2**2, kernel_size=3, padding=1, stride=2), #1 12 64 64
nn.Tanh(),
nn.Conv2d(num_input_channels*2**2, num_input_channels*2**3, kernel_size=3, padding=1, stride=2), #1 24 32 32
nn.Tanh(),
nn.Conv2d(num_input_channels*2**3, num_input_channels*2**4, kernel_size=3, padding=1, stride=2), #1 48 16 16
nn.Tanh(),
nn.Conv2d(num_input_channels*2**4, num_input_channels*2**5, kernel_size=3, padding=1, stride=2), #1 96 8 8
nn.Tanh(),
nn.Conv2d(num_input_channels*2**5, num_input_channels*2**6, kernel_size=3, padding=1, stride=2), #1 192 4 4
nn.LeakyReLU(),
nn.Conv2d(num_input_channels*2**6, num_input_channels*2**7, kernel_size=3, padding=1, stride=2), #1 384 2 2
nn.LeakyReLU(),
nn.Conv2d(num_input_channels*2**7, num_input_channels*2**8, kernel_size=2, padding=0, stride=1), #1 768 1 1
nn.LeakyReLU(),
nn.Flatten(),
nn.Linear(768, 1024*32),
nn.ReLU(),
nn.Linear(1024*32, 256),
nn.ReLU(),
).cuda()
我得到错误";RuntimeError:mat1和mat2形状不能相乘(768x1和768x32768(";
据我所知,在卷积之后,我应该得到一个形状张量[1768,1,1]和[1768],这样我就可以使用一个大小为1024*32的完全连接的线性层(通过它,我试图为神经网络添加更多存储数据/知识的方法(。
使用CCD_ 1运行时稍后会发出警告:";用户警告:使用不同于输入大小(torch.size([768,325656]((的目标大小(tork.size([3256256]((";。我认为它来自我的解码器,尽管
我在这里有什么理解不正确的地方?
所有torch.nn
模块都需要批量输入,而且在您的案例中似乎没有批量维度。在不知道你的代码的情况下,我假设你正在使用
my_input.shape == (3, 256, 256)
但你需要添加一个批次维度,也就是说,你需要有
my_input.shape == (1, 3, 256, 256)
你可以很容易地做到这一点,通过引入一个虚拟维度使用:
my_input = my_input[None, ...]