李沐动手学深度学习09图片分类数据集代码新手版

一、MNIST数据集是图像分类中广泛使用的数据集之一,但作为基准数据集过于简单。我们将使用类似但复杂的Fashion-MNIST数据集

%matplotlib inline
import torch
import torchvision
# 是pytorch关于计算机视觉模型实现的库
from torch.utils import data
# 在utils中读取data,方便读取数据
from torchvision import transforms
# transforms是一个对数据进行操作的模具
from d2l import torch as d2l
# 将一些函数对torch的实现导入d2l

d2l.use_svg_display()
# 用svg来显示图片,清晰度高一点

二、通过框架中的内置函数将Fashion-MINIST数据集下载并读取到内存中

# 通过ToTensor实例将图像数据从PTL类型变换为32位浮点数格式
# 并除以255使得所有像素的数值均在0-1之间
trans = transforms.ToTensor()

# 训练数据集
mnist_train = torchvision.datasets.FashionMNIST(root=r'../data', train=True,
                                                transform=trans, download=True)
# 将FashionMNIST从dataset中拿到,下载到上一级目录的data里
# train=true的意思是指下载的是训练数据集
# transform=trans的意思是指拿出来的是tensor而不是一堆图片
# download=True的意思是指默认从网上下载

# 测试数据集
mnist_test = torchvision.datasets.FashionMNIST(root=r'../data', train=False,
                                               transform=trans, download=True)
# 将../data改为C:\Users\LIU\Desktop就可运行,可能是权限问题,但是小白不懂,只是慢慢调
print(len(mnist_train))
print(len(mnist_test))
# 输出样本集中各有多少张图片

print(mnist_train[0][0].shape)
# 第一个0表示第一个example,第二个0表示第一张图片,欲求其形状

根据错误消息,这个问题是由于权限错误导致的。程序试图在指定的目录"../data"下创建文件夹,但是没有足够的权限来执行该操作。

要解决这个问题,你可以尝试以下几个方法:

  1. 检查路径权限:确保你有足够的权限在指定的目录下创建文件夹。如果你是在一个受限制的环境中运行代码(例如在共享的计算机上),你可能需要联系系统管理员来获取适当的权限。

  2. 更改路径:尝试更改保存数据集的目录路径。你可以选择一个你有权限访问的目录,或者使用当前工作目录下的相对路径。

  3. 运行代码时使用管理员权限:如果你是在Windows系统上运行代码,尝试以管理员身份运行你的代码。右键点击代码文件或命令提示符,并选择"以管理员身份运行"。

  4. 更改目录所有者:如果你是在类Unix系统上运行代码,你可以尝试更改目录的所有者,或者使用sudo命令来获得足够的权限执行操作。

过程中看网上解决方法有:点进anaconda3安装文件夹,找到里面的python.exe,属性>兼容性>管理员啥的,但我采用此方法后不能打开jupyter lab,原因未知

1表示黑白图片的RGB通道为1,长和宽均为28

补充

将路径中root = ../data改为root = r'C:\Users\LIU\Desktop'后在这里可以运行但是到下一步softmax从零开始中第一步出现问题了

所以在网上找了一下解决方案,还是应该先点进anaconda3安装文件夹,找到里面的python.exe,属性>兼容性>设置为管理员;然后《《在最近应用中找到Anoconda Prompt,右键找到以管理员权限运行,输入jupyter lab就可打开jupyter lab》》

三、两个可视化数据集的函数

def get_fashion_mnist_labels(labels):
    '''返回Fashion-MNIST数据集的文本标签'''
    text_labels = [
        't-shirt', 'trouser', 'pullover', 'dress', 'coat', 'sandal', 'shirt','sneaker', 'bag', 'ankle boot'
    ]
    return [text_labels[int(i)] for i in labels]
# 数据集有10个关于衣服的类别
 
def show_images(imgs, num_rows, num_cols, titles=None, scale=1.5):
    '''Plot a list of images.'''
    figsize = (num_cols * scale, num_rows * scale)
    _, axes = d2l.plt.subplots(num_rows, num_cols, figsize=figsize)
    axes = axes.flatten()
    for i, (ax, img) in enumerate(zip(axes, imgs)):
        if torch.is_tensor(img):
            # 图片张量
            ax.imshow(img.numpy())
 
        else:
            # PIL图片
            ax.imshow(img)

四、样本图像及其标签

# 几个样本的图像及其相应的标签
X, y = next(iter(data.DataLoader(mnist_train, batch_size=18)))
# 构造一个数据集之后可以放进一个dataload里面,指定一个size就可以拿到一个批量大小固定的数据
# next是拿到第一个小批量
show_images(X.reshape(18, 28, 28), 2, 9, titles=get_fashion_mnist_labels(y))
# channel数据不用了,reshape成一个numbersexamples,长宽为28,画成2行9列,title是标号从label中获得

五、读取一小批量数据,大小为batch_size

batch_size = 256
 
def get_dataloader_workers():
    '''使用4个进程来读取的数据'''
    return 4
 
train_iter = data.DataLoader(mnist_train, batch_size, shuffle=True, num_workers=get_dataloader_workers())
# 给定batchsize,指定是否需要随机打乱顺序(训练集一定需要打乱,测试集不一定),numworker指进程
timer = d2l.Timer()
# 用来测试速度
for X, y in train_iter:
    continue
# 用x,y一个一个扫一遍数据 

print(f'{timer.stop():.2f} sec')
# 出来的结果是读取数据的速度,所以有可能模型训练很快但数据读不过来,所以训练之前通常要看

六、定义load_data_fashion_mnist函数

def load_data_fashion_mnist(batch_size, resize=None):
# resize是变换图片大小
    '''下载Fashion-MNIST数据集,然后将其加载到内存中'''
    trans = [transforms.ToTensor()]
    if resize:
        trans.insert(0, transforms.Resize(resize))
        # 可以将图片变得更大一点
    trans = transforms.Compose(trans)
    mnist_train = torchvision.datasets.FashionMNIST(root=r'C:\Users\LIU\Desktop', train=True, transform=trans, download=True)
    mnist_test = torchvision.datasets.FashionMNIST(root=r'C:\Users\LIU\Desktop', train=False, transform=trans, download=True)
    return (data.DataLoader(mnist_train, batch_size, shuffle=True, num_workers=get_dataloader_workers()),
            data.DataLoader(mnist_train, batch_size, shuffle=False, num_workers=get_dataloader_workers()))

train_iter, test_iter = load_data_fashion_mnist(32, resize=64)
for X, y in train_iter:
    print(X.shape, X.dtype, y.shape, y.dtype)
    break
torch.Size([32, 1, 64, 64]) torch.float32 torch.Size([32]) torch.int64

七、完整代码

# MNIST数据集是图像分类中广泛使用的数据集之一,但作为基准数据集过于简单。我们将使用类似但复杂的Fashion-MNIST数据集
import torch
import torchvision
from torch.utils import data
from torchvision import transforms
from d2l import torch as d2l

d2l.use_svg_display()

trans = transforms.ToTensor()
mnist_train = torchvision.datasets.FashionMNIST(root='../data', train=True,
                                                transform=trans, download=True)
mnist_test = torchvision.datasets.FashionMNIST(root='../data', train=False,
                                               transform=trans, download=True)
 
print(len(mnist_train))
print(len(mnist_test))
 
print(mnist_train[0][0].shape)

def get_fashion_mnist_labels(labels):
    '''返回Fashion-MNIST数据集的文本标签'''
    text_labels = [
        't-shirt', 'trouser', 'pullover', 'dress', 'coat', 'sandal', 'shirt','sneaker', 'bag', 'ankle boot'
    ]
    return [text_labels[int(i)] for i in labels]
# 数据集有10个关于衣服的类别
 
def show_images(imgs, num_rows, num_cols, titles=None, scale=1.5):
    '''Plot a list of images.'''
    figsize = (num_cols * scale, num_rows * scale)
    _, axes = d2l.plt.subplots(num_rows, num_cols, figsize=figsize)
    axes = axes.flatten()
    for i, (ax, img) in enumerate(zip(axes, imgs)):
        if torch.is_tensor(img):
            # 图片张量
            ax.imshow(img.numpy())
 
        else:
            # PIL图片
            ax.imshow(img)

# 几个样本的图像及其相应的标签
X, y = next(iter(data.DataLoader(mnist_train, batch_size=18)))
# 构造一个数据集之后可以放进一个dataload里面,指定一个size就可以拿到一个批量大小固定的数据
# next是拿到第一个小批量
show_images(X.reshape(18, 28, 28), 2, 9, titles=get_fashion_mnist_labels(y))
# channel数据不用了,reshape成一个numbersexamples,长宽为28,画成2行9列,title是标号从label中获得

batch_size = 256
 
def get_dataloader_workers():
    '''使用4个进程来读取的数据'''
    return 4
 
train_iter = data.DataLoader(mnist_train, batch_size, shuffle=True, num_workers=get_dataloader_workers())
# 给定batchsize,指定是否需要随机打乱顺序(训练集一定需要打乱,测试集不一定),numworker指进程
timer = d2l.Timer()
# 用来测试速度
for X, y in train_iter:
    continue
# 用x,y一个一个扫一遍数据 

print(f'{timer.stop():.2f} sec')

def load_data_fashion_mnist(batch_size, resize=None):
# resize是变换图片大小
    '''下载Fashion-MNIST数据集,然后将其加载到内存中'''
    trans = [transforms.ToTensor()]
    if resize:
        trans.insert(0, transforms.Resize(resize))
        # 可以将图片变得更大一点
    trans = transforms.Compose(trans)
    mnist_train = torchvision.datasets.FashionMNIST(root='../data', train=True, transform=trans, download=True)
    mnist_test = torchvision.datasets.FashionMNIST(root='../data', train=False, transform=trans, download=True)
    return (data.DataLoader(mnist_train, batch_size, shuffle=True, num_workers=get_dataloader_workers()),
            data.DataLoader(mnist_train, batch_size, shuffle=False, num_workers=get_dataloader_workers()))

train_iter, test_iter = load_data_fashion_mnist(32, resize=64)
for X, y in train_iter:
    print(X.shape, X.dtype, y.shape, y.dtype)
    break
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>