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)

TensorFlow 标签号与轴上的形状不匹配

Python TensorFlow 形状不匹配(WaveNet)

TensorFlow安装教程(CPU版)

如何在TensorFlow中向CNN输入多个序列?

利用keras搭建CNN进行mnist数据集分类