【问题标题】:Tensorflow CNN shape mismatchTensorFlow CNN 形状不匹配
【发布时间】: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 转换为灰度

【问题讨论】:

    标签: deep-learning data-science torch conv-neural-network


    【解决方案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 形状。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2021-01-09
    • 2017-10-25
    • 2018-08-23
    • 2021-12-13
    • 1970-01-01
    • 2020-09-22
    相关资源
    最近更新 更多