【问题标题】:I got runtime Error in making model with CNN使用 CNN 制作模型时出现运行时错误
【发布时间】:2021-05-25 15:34:33
【问题描述】:

我想用 Cnn 制作模型。但它总是显示张量大小错误。我在代码的任何部分都找不到这种大小!可以使用两个类参数,当我将其更改为 4 时它会发生 这是我的代码

from __future__ import print_function, division

import torch
import torch.nn as nn
import torch.optim as optim
from torch.optim import lr_scheduler
import torchvision
from torchvision import datasets, models, transforms
import matplotlib.pyplot as plt
import numpy as np
import time
import os
import copy

import os
import shutil
import re

two_train =  "/Data/train/2"
two_val =  "/Data/val/2"
nine_train =  "/Data/train/9"
nine_val = "/Data/val/9"
seven_train =  "/Data/train/7"
seven_val = "/Data/val/7"
eight_train =  "/Data/train/8"
eight_val = "/Data/val/8"

two_files = os.listdir(two_train)
nine_files = os.listdir(nine_train)
seven_files = os.listdir(seven_train)
eight_files = os.listdir(eight_train)

# Make transforms and use data loaders

# We'll use these a lot, so make them variables
mean_nums = [0.485, 0.456, 0.406]
std_nums = [0.229, 0.224, 0.225]

chosen_transforms = {'train': transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize(mean_nums, std_nums)
]), 'val': transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize(mean_nums, std_nums)
]),
}

# Set the directory for the data
data_dir = '/content/drive/MyDrive/Data/'

# Use the image folder function to create datasets
chosen_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x),
  chosen_transforms[x])
                  for x in ['train', 'val']}

# Make iterables with the dataloaders
dataloaders = {x: torch.utils.data.DataLoader(chosen_datasets[x], batch_size=4,
  shuffle=True, num_workers=8)
              for x in ['train', 'val']}

dataset_sizes = {x: len(chosen_datasets[x]) for x in ['train', 'val']}
class_names = chosen_datasets['train'].classes

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

dataset_sizes
# class_names
# device
mean_nums

def imshow(inp, title=None):
    inp = inp.numpy().transpose((1, 2, 0))
    mean = np.array([mean_nums])
    std = np.array([std_nums])
    inp = std * inp + mean
    inp = np.clip(inp, 0, 1)
    plt.imshow(inp)
    if title is not None:
        plt.title(title)
    plt.pause(0.001)  # Pause a bit so that plots are updated


# Grab some of the training data to visualize
inputs, classes = next(iter(dataloaders['train']))

我得到了这个错误:

Caught RuntimeError in DataLoader worker process 0.
Original Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/torch/utils/data/_utils/worker.py", line 198, in _worker_loop
    data = fetcher.fetch(index)
  File "/usr/local/lib/python3.6/dist-packages/torch/utils/data/_utils/fetch.py", line 47, in fetch
    return self.collate_fn(data)
  File "/usr/local/lib/python3.6/dist-packages/torch/utils/data/_utils/collate.py", line 83, in default_collate
    return [default_collate(samples) for samples in transposed]
  File "/usr/local/lib/python3.6/dist-packages/torch/utils/data/_utils/collate.py", line 83, in <listcomp>
    return [default_collate(samples) for samples in transposed]
  File "/usr/local/lib/python3.6/dist-packages/torch/utils/data/_utils/collate.py", line 55, in default_collate
    return torch.stack(batch, 0, out=out)
RuntimeError: stack expects each tensor to be equal size, but got [3, 65, 36] at entry 0 and [3, 61, 39] at entry 

最后一行发生错误,并在控制台上显示此错误! 我在网上搜索,但什么都没有

【问题讨论】:

    标签: python pytorch classification


    【解决方案1】:

    该错误意味着 PyTorch 正在尝试沿批处理维度堆叠 2 个具有不同形状的张量。 这是由于数据集中的图像具有不同的大小。

    解决问题的一种方法是添加Resize 转换,例如:

    chosen_transforms = {'train': transforms.Compose([
            transforms.Resize((65, 40)),
            transforms.ToTensor(),
            transforms.Normalize(mean_nums, std_nums)
    ]), 'val': transforms.Compose([
            transforms.Resize((65, 40)),
            transforms.ToTensor(),
            transforms.Normalize(mean_nums, std_nums)
    ]),
    }
    

    您可能还必须使用 PIL 强制加载图像:

    # Use the image folder function to create datasets
    chosen_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x),
      chosen_transforms[x], loader=torchvision.datasets.folder.pil_loader)
                      for x in ['train', 'val']}
    
    

    【讨论】:

    • 我添加了它,现在它说它需要是 PIL 但是当我添加 PIL 时它说需要是 Tensor 或 ndarray!
    • 我已经编辑了我的答案。可以再试一次吗?
    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 2018-12-03
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2021-04-17
    • 1970-01-01
    相关资源
    最近更新 更多