python torch 报错TypeError: object

2019-12-23  本文已影响0人  牛奶大泡芙

周末用pytorch框架写了一个卷积神经网络的小demo,运行的时候报了一个错误,如下图


typeerror.jpg

代码如下

import torch
import torch.nn as nn
from torch.autograd import Variable
import torch.utils.data as Data
from torchvision import datasets, transforms
import matplotlib.pyplot as plt

EPOCH = 1
BATCH_SIZE = 50
LR = 0.001
DOWNLOAD_MNIST = False

train_data = datasets.MNIST(
    root='./mnist',  # 数据保存的目录
    train=True,  # 是训练的数据,False的话会给test数据,少一些
    transform=transforms.ToTensor,  # (0,255)-->(0,1) 把原始的数据改成什么样的,这里Numpy Array改成Tensor的格式
    download=DOWNLOAD_MNIST  # 如果已经下载数据设成False,否则用True
)

train_loader = Data.DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True, num_workers=0)
test_data = datasets.MNIST(root='./mnist',
                           train=False,
                           download=False,
                           transform=transforms.ToTensor()
                           )  # train=False会提取出文件夹下的test数据
test_x = Variable(torch.unsqueeze(test_data.test_data, dim=1), volatile=True).type(torch.FloatTensor)[:2000]/255
# 原始数据在[0,255]之间,应该要压缩到1之内
test_y = test_data.test_labels[:2000]  # 截取前2000个可以节约内存,和程序无关


class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        self.conv1 = nn.Sequential(
            nn.Conv2d(  # 输入的数据尺寸是:1*28*28
                in_channels=1,  # 图片有多少个通道,灰度图有一个层,rgb有三个层(高度为1的图片)
                out_channels=16,  # 输出的高度==滤波器的数量,输出的通道有16个(高度为16的图片)
                kernel_size=5,  # 卷积核的长和宽都是5
                stride=1,  # 卷积核每次只移动1个格子(pixel)
                padding=2  # 5-1/2=2,因为卷积核靠边,所以需要在每一个图片周围添加2行数据
            ),  # 卷积层是一个过滤器,提取出局部的特征
            nn.ReLU(),  # 激活函数
            nn.MaxPool2d(kernel_size=2),  # 最大池化,筛选重要的部分
        )
        self.conv2 = nn.Sequential(
            nn.Conv2d(16, 32, 5, 1, 2),  # 接收16层的图片加工成32层
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2),
        )
        self.out = nn.Linear(32*7*7, 10)  # 展平成二维数据,28-maxpool(2)->14-maxpool(2)->7

    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)  # (batch,32,7,7)
        x = x.view(x.size(0), -1)  # 展平(batch,32*7*7)-1让32 7 7展平到一起
        return x

cnn = CNN()
optimizer = torch.optim.Adam(cnn.parameters(), lr=LR)
loss_func = nn.CrossEntropyLoss()  # 因为使用的是label的数据
for epoch in range(EPOCH):
    # print(enumerate(train_loader))
    # d = iter(train_loader).next()
    # dataiter = iter(train_loader)
    # images, labels = dataiter.next()
    for i, data in enumerate(train_loader):
        inputs, labels = data
        b_x = Variable(inputs)
        b_y = Variable(labels)

        output = cnn(b_x)
        # print('out', inputs, labels, output)
        loss = loss_func(output, b_y)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

捡查了一下原因是,datasets.MNIST的transform=transforms.ToTensor没有加()执行

上一篇下一篇

猜你喜欢

热点阅读