TensorFlow CNN 形状不匹配
Posted
技术标签:
【中文标题】TensorFlow CNN 形状不匹配【英文标题】:Tensorflow CNN shape mismatch 【发布时间】:2020-10-05 07:40:05 【问题描述】:def load_data(data_path, batch_size, num_workers=2):
t_m = transforms.Compose(
[transforms.Grayscale(num_output_channels=1),
transforms.Resize((400,400)),
transforms.ToTensor(),
# transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
dataset = torchvision.datasets.ImageFolder(root = data_path, transform=t_m)
# print (np.shape(dataset))
#split
train, test = torch.utils.data.random_split(dataset, [int( len(dataset) * 0.7 ), len(dataset) - int( len(dataset) * 0.7 ) ])
trainloader = torch.utils.data.DataLoader(train, batch_size=batch_size,
shuffle=True, num_workers=num_workers,drop_last = True)
testloader = torch.utils.data.DataLoader(test, batch_size=batch_size,
shuffle=False, num_workers=num_workers, drop_last = False)
return dataset,trainloader,testloader
import torch.nn as nn
model = torch.nn.Sequential(
nn.Conv2d(1, 32, kernel_size=5, padding=2),
nn.MaxPool2d(2, 2),
nn.Conv2d(32, 64, kernel_size=5, padding=2),
nn.MaxPool2d(2, 2),
nn.Linear ( 7 * 7 * 64, 1000),
nn.Linear(1000, 600),
nn.Linear(600, 200),
nn.Linear(200, 10)
)
#Training
total_epochs = 5
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adadelta(model.parameters())
for epoch in tqdm(range(total_epochs)):
#initialize
batch_count = 0
gc.collect()
loop_loss = 0.0
for img in (trainloader):
input_, label_ = img
# print (input_.shape)
out = model(input_)
out= nn.functional.relu(out)
loss = criterion(out, label_)
loss.backward()
optimizer.zero_grad()
optimizer.step()
loop_loss = loop_loss + loss.item()
batch_count = batch_count + 1
print('batch_loss: ', str(loss.item()))
print('Epochs completed:', epoch+1,'\n')
print('epoch_loss = ' + loop_loss/float(batch_count))
大小不匹配,m1:[25600 x 100],m2:[3136 x 1000] 在 /pytorch/aten/src/TH/generic/THTensorMath.cpp:41
请解释形状哪里出错了?我应该如何解决这个问题? 我是新手,所以这可能不是一个好问题,但任何细节都会有所帮助 输入图像大小调整为 400,400 并从 rgb 转换为灰度
【问题讨论】:
【参考方案1】:您的问题出在第一个线性层。总是这样编码,以便您自己弄清楚。
class MyModel(nn.Module):
def __init__(self, params):
super(MyModel, self).__init__()
self.conv1 = nn.Conv2d(...)
self.fc = nn.Linear(...)
def forward(self, x):
x = self.conv1(x)
import pdb; pdb.set_trace()
x = self.fc(x)
return x
这样你可以把 pdb 放在你想要的地方,你可以使用 x.shape 命令检查形状。您的问题在于 conv 层的输出形状与您的第一个 Linear 层之间的不匹配。
【讨论】:
作为参数传递什么? @AtqaAmir 看看这个:github.com/pytorch/vision/blob/master/torchvision/models/…,参数可以是类似 num_classes 的东西。如果您以这种方式执行,在 forward 方法中,您可以放置 pdb 跟踪器并检查张量的形状。 @AtqaAmir,也不要忘记将问题编辑为 PyTorch 形状。以上是关于TensorFlow CNN 形状不匹配的主要内容,如果未能解决你的问题,请参考以下文章
根据输入形状的计算是不是存在差异? (带有 Tensorflow 的 Python 中的 CNN)