如何解决由于 PyTorch 中的大小不匹配导致的运行时错误?
How to resolve runtime error due to size mismatch in PyTorch?
我正在尝试使用 PyTorch
实现一个简单的自动编码器。我的数据集包含 256 x 256 x 3 图像。我已经构建了一个 torch.utils.data.dataloader.DataLoader
对象,它将图像存储为张量。当我 运行 自动编码器时,我得到一个 运行 时间错误:
size mismatch, m1: [76800 x 256], m2: [784 x 128] at
/Users/soumith/minicondabuild3/conda-bld/pytorch_1518371252923/work/torch/lib/TH/generic/THTensorMath.c:1434
这些是我的超参数:
batch_size=100,
learning_rate = 1e-3,
num_epochs = 100
以下是我的自动编码器的架构:
class autoencoder(nn.Module):
def __init__(self):
super(autoencoder, self).__init__()
self.encoder = nn.Sequential(
nn.Linear(3*256*256, 128),
nn.ReLU(),
nn.Linear(128, 64),
nn.ReLU(True),
nn.Linear(64, 12),
nn.ReLU(True),
nn.Linear(12, 3))
self.decoder = nn.Sequential(
nn.Linear(3, 12),
nn.ReLU(True),
nn.Linear(12, 64),
nn.ReLU(True),
nn.Linear(64, 128),
nn.Linear(128, 3*256*256),
nn.ReLU())
def forward(self, x):
x = self.encoder(x)
#x = self.decoder(x)
return x
这是我用来 运行 模型的代码:
for epoch in range(num_epochs):
for data in dataloader:
img = data['image']
img = Variable(img)
# ===================forward=====================
output = model(img)
loss = criterion(output, img)
# ===================backward====================
optimizer.zero_grad()
loss.backward()
optimizer.step()
# ===================log========================
print('epoch [{}/{}], loss:{:.4f}'
.format(epoch+1, num_epochs, loss.data[0]))
if epoch % 10 == 0:
pic = show_img(output.cpu().data)
save_image(pic, './dc_img/image_{}.jpg'.format(epoch))
如果你的输入是3 x 256 x 256
,那么你需要将它转换成B x N
来通过线性层:nn.Linear(3*256*256, 128)
其中B
是batch_size
和 N
是线性层输入大小。
如果您一次给出一张图像,您可以将形状为 3 x 256 x 256
的输入张量转换为 1 x (3*256*256)
,如下所示。
img = img.view(1, -1) # converts [3 x 256 x 256] to 1 x 196608
output = model(img)
每当你有:
RuntimeError: size mismatch, m1: [a x b], m2: [c x d]
您只需要关心 b=c
即可完成:
m1
是 [a x b]
即 [batch size x in features]
m2
是 [c x d]
即 [in features x out features]
你的错误:
size mismatch, m1: [76800 x 256], m2: [784 x 128]
表示前一层输出形状不等于下一层输入形状
[76800 x 256], m2: [784 x 128] # Incorrect!
[76800 x 256], m2: [256 x 128] # Correct!
我正在尝试使用 PyTorch
实现一个简单的自动编码器。我的数据集包含 256 x 256 x 3 图像。我已经构建了一个 torch.utils.data.dataloader.DataLoader
对象,它将图像存储为张量。当我 运行 自动编码器时,我得到一个 运行 时间错误:
size mismatch, m1: [76800 x 256], m2: [784 x 128] at /Users/soumith/minicondabuild3/conda-bld/pytorch_1518371252923/work/torch/lib/TH/generic/THTensorMath.c:1434
这些是我的超参数:
batch_size=100,
learning_rate = 1e-3,
num_epochs = 100
以下是我的自动编码器的架构:
class autoencoder(nn.Module):
def __init__(self):
super(autoencoder, self).__init__()
self.encoder = nn.Sequential(
nn.Linear(3*256*256, 128),
nn.ReLU(),
nn.Linear(128, 64),
nn.ReLU(True),
nn.Linear(64, 12),
nn.ReLU(True),
nn.Linear(12, 3))
self.decoder = nn.Sequential(
nn.Linear(3, 12),
nn.ReLU(True),
nn.Linear(12, 64),
nn.ReLU(True),
nn.Linear(64, 128),
nn.Linear(128, 3*256*256),
nn.ReLU())
def forward(self, x):
x = self.encoder(x)
#x = self.decoder(x)
return x
这是我用来 运行 模型的代码:
for epoch in range(num_epochs):
for data in dataloader:
img = data['image']
img = Variable(img)
# ===================forward=====================
output = model(img)
loss = criterion(output, img)
# ===================backward====================
optimizer.zero_grad()
loss.backward()
optimizer.step()
# ===================log========================
print('epoch [{}/{}], loss:{:.4f}'
.format(epoch+1, num_epochs, loss.data[0]))
if epoch % 10 == 0:
pic = show_img(output.cpu().data)
save_image(pic, './dc_img/image_{}.jpg'.format(epoch))
如果你的输入是3 x 256 x 256
,那么你需要将它转换成B x N
来通过线性层:nn.Linear(3*256*256, 128)
其中B
是batch_size
和 N
是线性层输入大小。
如果您一次给出一张图像,您可以将形状为 3 x 256 x 256
的输入张量转换为 1 x (3*256*256)
,如下所示。
img = img.view(1, -1) # converts [3 x 256 x 256] to 1 x 196608
output = model(img)
每当你有:
RuntimeError: size mismatch, m1: [a x b], m2: [c x d]
您只需要关心 b=c
即可完成:
m1
是 [a x b]
即 [batch size x in features]
m2
是 [c x d]
即 [in features x out features]
你的错误:
size mismatch, m1: [76800 x 256], m2: [784 x 128]
表示前一层输出形状不等于下一层输入形状
[76800 x 256], m2: [784 x 128] # Incorrect!
[76800 x 256], m2: [256 x 128] # Correct!