一、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"下创建文件夹,但是没有足够的权限来执行该操作。
要解决这个问题,你可以尝试以下几个方法:
-
检查路径权限:确保你有足够的权限在指定的目录下创建文件夹。如果你是在一个受限制的环境中运行代码(例如在共享的计算机上),你可能需要联系系统管理员来获取适当的权限。
-
更改路径:尝试更改保存数据集的目录路径。你可以选择一个你有权限访问的目录,或者使用当前工作目录下的相对路径。
-
运行代码时使用管理员权限:如果你是在Windows系统上运行代码,尝试以管理员身份运行你的代码。右键点击代码文件或命令提示符,并选择"以管理员身份运行"。
-
更改目录所有者:如果你是在类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