网站建设的可行性报告,怎么给网站做301,哈尔滨最好的网站建设公司,网站建设江门 优荐1 Fashion-MNIST简介
FashionMNIST 是一个替代 MNIST 手写数字集 的图像数据集。 它是由 Zalando#xff08;一家德国的时尚科技公司#xff09;旗下的研究部门提供。其涵盖了来自 10 种类别的共 7 万个不同商品的正面图片。 FashionMNIST 的大小、格式和训练集/测试集划分与… 1 Fashion-MNIST简介
FashionMNIST 是一个替代 MNIST 手写数字集 的图像数据集。 它是由 Zalando一家德国的时尚科技公司旗下的研究部门提供。其涵盖了来自 10 种类别的共 7 万个不同商品的正面图片。 FashionMNIST 的大小、格式和训练集/测试集划分与原始的 MNIST 完全一致。60000/10000 的训练测试数据划分28x28 的灰度图片。你可以直接用它来测试你的机器学习和深度学习算法性能且不需要改动任何的代码。说白了就是手写数字没有衣服鞋子之类的更复杂。
1.1 Fashion-MNIST数据集标签类件组成
Fashion-MNIST数据集包含了10个类别的图像分别是t-shirtT恤trouser牛仔裤pullover套衫dress裙子coat外套sandal凉鞋shirt衬衫sneaker运动鞋bag包ankle boot短靴。 1.2 Fashion-MNIST数据集文件组成
共包含四个文件分别为
训练数据图片train-images-idx3-ubyte训练数据标签train-labels-idx1-ubyte测试数据图片t10k-images-idx3-ubyte测试数据标签t10k-labels-idx1-ubyte
1.3 Fashion-MNIST数据集序列号
标注编号描述 0T-shirt/topT恤 1Trouser裤子 2Pullover套衫 3Dress裙子 4Coat外套 5Sandal凉鞋 6Shirt汗衫 7Sneaker运动鞋 8Bag包 9Ankle boot踝靴
2 识别黑白图中的服装图案实战代码分解
2.1 自动下载Fashion-MNIST数据集
2.1.1 自动下载代码---Fashion-MNISt-CNN.py第1部分
import torchvision
import torchvision.transforms as transforms
import pylab
import torch
from matplotlib import pyplot as plt
import torch.utils.data
import torch.nn.functional as F
import numpy as np
import os
os.environ[KMP_DUPLICATE_LIB_OK]TRUE# 定义显示图像的函数
def imshow(img):print(图片形状,np.shape(img))img img/2 0.5npimg img.numpy()plt.axis(off)plt.imshow(np.transpose(npimg,(1,2,0)))### 1.1 自动下载FashionMNIST数据集
data_dir ./fashion_mnist # 设置存放位置
transform transforms.Compose([transforms.ToTensor()]) # 可以自动将图片转化为Pytorch支持的形状[通道高宽]同时也将图片的数值归一化
train_dataset torchvision.datasets.FashionMNIST(data_dir,trainTrue,transformtransform,downloadTrue)
print(训练集的条数,len(train_dataset))
2.2 读取及其显示Fashion-MNIST中的数据
2.2.1 读取及其显示Fashion-MNIST中的数据代码实现 ---Fashion-MNISt-CNN.py第2部分
### 1.2 读取及显示FashionMNIST数据集中的数据
val_dataset torchvision.datasets.FashionMNIST(rootdata_dir,trainFalse,transformtransform)
print(测试集的条数,len(val_dataset))
2.2.2 FAshion-MNIST数据集补充知识 Fashion-MNST数据集中的图片大小是28像素×28像素。每-幅图就是1行784(28×28)列的数据括二中的每个值优麦一个像素。 关于像素如果是黑白的图片那么图案中黑色的地方数值为Q在有图案的地方数据为0~255的数字代表其颜色的深度。如果是彩色的图片那么一个像素会有3个值来表示其RGB(红、绿、蓝)值。 2.3 制造批次数据集
2.3.1 数据集封装类 DataLoader
torch.utils.data.DataLoader(dataset, batch_size1,shuffleFalse,samplerNone,batch_samplerNone, num_workers0, collate_fnNone,pin_memoryFalse, drop_lastFalse, timeout0worker_init_fnNone)
Arguments:dataset (Dataset): 是一个DataSet对象表示需要加载的数据集.batch_size (int, optional): 每一个batch加载多少组样本即指定batch_size默认是 1 shuffle (bool, optional): 布尔值True或者是False 表示每一个epoch之后是否对样本进行随机打乱默认是False
------------------------------------------------------------------------------------sampler (Sampler, optional): 接受一个采集器对象并且使用该策略进行提取样本如果指定这个参数那么shuffle必须为Falsebatch_sampler (Sampler, optional): 与sampler类似但是一次只返回一个batch的indices索引需要注意的是一旦指定了这个参数那么batch_size,shuffle,sampler,drop_last就不能再制定了互斥。
------------------------------------------------------------------------------------num_workers (int, optional): 设置加载数据的额外进程数量。0意味着所有的数据都会被load进主进程。默认为0collate_fn (callable, optional): 接收一个自定义函数。当该参数不为None时系统会在从数据集中取出数据之后将数据传入collate_fn中由collate_fn参数所指向的函数对数据进行二次加工。该参数常用于在不同场景测试和训练场景下对同一数据集的数据提取。pin_memory (bool, optional): 如果设置为True那么data loader将会在返回它们之前将tensors拷贝到CUDA中的固定内存CUDA pinned memory中.
------------------------------------------------------------------------------------drop_last (bool, optional): 如果设置为True这个是对最后的未完成的batch来说的比如你的batch_size设置为64而一个epoch只有100个样本那么训练的时候后面的36个就被扔掉了如果为False默认那么会继续正常执行只是最后的batch_size会小一点。
------------------------------------------------------------------------------------timeout (numeric, optional): 如果是正数表明等待从worker进程中收集一个batch等待的时间若超出设定的时间还没有收集到停止收集。这个numeric应总是大于等于0。默认为0. worker_init_fn (callable, optional): 每个子进程的初始化函数加载数据之前运行。
2.3.3 DataLoader中的Sampler类
SequentialSampler按照原有的样本顺序进行采样。RandomSampler按照随机u顺序进行采样可以设置是否重复采样。SubsetRandomSampler按照指定的集合或索引列表进行随机顺序采样。WeightedRandomSampler按照指定的概率进行随机顺序采样。BatchSampler按照指定的批次索引进行采样。
2.3.4 按照批次封装Fashion-MNIST数据集 ---Fashion-MNISt-CNN.py第3部分
### 1.3 按批次封装FashionMNIST数据集
batch_size 10 #设置批次大小
train_loader torch.utils.data.DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue)
test_loader torch.utils.data.DataLoader(val_dataset, batch_sizebatch_size, shuffleFalse)
2.3.5 读取批次数据集实战代码 ---Fashion-MNISt-CNN.py第4部分
### 1.4 读取批次数据集
## 定义类别名称
classes (T-shirt, Trouser, Pullover, Dress, Coat, Sandal, Shirt, Sneaker, Bag, Ankle_Boot)
sample iter(train_loader) # 将数据集转化成迭代器
images,labels sample.next() # 从迭代器中取得一批数据
print(样本形状,np.shape(images)) # 打印样本形状
# 输出 样本形状 torch.Size([10, 1, 28, 28])
print(样本标签,labels)
# 输出 图片形状 torch.Size([3, 32, 302])
imshow(torchvision.utils.make_grid(images,nrow batch_size)) # 数据可视化make_grid()将该批次的图片内容组合为一个图片用于显示nrow用于设置生成图片中每行的样本数量
print(,.join(%5s % classes[labels[j]] for j in range(len(images))))
# 输出 Trouser,Trouser,Dress, Bag,Shirt,Sandal,Shirt,Dress, Bag, Bag
2.4 构建并训练模型
2.4.1 定义模型类MyConNet---Fashion-MNISt-CNN.py第5部分
总体结构为两个卷积层结合3个全连接层如下图 ### 1.5 定义模型类
class myConNet(torch.nn.Module):def __init__(self):super(myConNet, self).__init__()# 定义卷积层self.conv1 torch.nn.Conv2d(in_channels 1 ,out_channels 6,kernel_size 5)self.conv2 torch.nn.Conv2d(in_channels 6,out_channels 12,kernel_size 5)# 定义全连接层self.fc1 torch.nn.Linear(in_features 12*4*4,out_features 120)self.fc2 torch.nn.Linear(in_features 120,out_features 60)self.out torch.nn.Linear(in_features 60,out_features 10) # 10是固定的因为必须要和模型所需要的分类个数一致def forward(self,t):# 第一层卷积和池化处理t self.conv1(t)t F.relu(t)t F.max_pool2d(t, kernel_size2, stride2)# 第二层卷积和池化处理t self.conv2(t)t F.relu(t)t F.max_pool2d(t, kernel_size2, stride2)# 搭建全连接网络第一层全连接t t.reshape(-1, 12 * 4 * 4) # 将卷积结果由4维变为2维t self.fc1(t)t F.relu(t)# 第二层全连接t self.fc2(t)t F.relu(t)# 第三层全连接t self.out(t)return t
if __name__ __main__:network myConNet() # 生成自定义模块的实例化对象#指定设备device torch.device(cuda:0if torch.cuda.is_available() else cpu)print(device)network.to(device)print(network) # 打印myConNet网络 输出 cuda:0 myConNet( (conv1): Conv2d(1, 6, kernel_size(5, 5), stride(1, 1)) (conv2): Conv2d(6, 12, kernel_size(5, 5), stride(1, 1)) (fc1): Linear(in_features192, out_features120, biasTrue) (fc2): Linear(in_features120, out_features60, biasTrue) (out): Linear(in_features60, out_features10, biasTrue) ) 2.4.2 定义损失的计算方法与优化---Fashion-MNISt-CNN.py第6部分
### 1.6 损失函数与优化器criterion torch.nn.CrossEntropyLoss() #实例化损失函数类optimizer torch.optim.Adam(network.parameters(), lr.01)
2.4.3 训练模型---Fashion-MNISt-CNN.py第7部分
### 1.7 训练模型for epoch in range(2): # 数据集迭代2次running_loss 0.0for i, data in enumerate(train_loader, 0): # 循环取出批次数据 使用enumerate()函数对循环计数第二个参数为0表示从0开始inputs, labels datainputs, labels inputs.to(device), labels.to(device) #optimizer.zero_grad() # 清空之前的梯度outputs network(inputs)loss criterion(outputs, labels) # 计算损失loss.backward() # 反向传播optimizer.step() # 更新参数running_loss loss.item()### 训练过程的显示if i % 1000 999:print([%d, %5d] loss: %.3f %(epoch 1, i 1, running_loss / 2000))running_loss 0.0print(Finished Training) 输出 [1, 1000] loss: 0.465 [1, 2000] loss: 0.346 [1, 3000] loss: 0.320 [1, 4000] loss: 0.301 [1, 5000] loss: 0.293 [1, 6000] loss: 0.293 [2, 1000] loss: 0.290 [2, 2000] loss: 0.280 [2, 3000] loss: 0.280 [2, 4000] loss: 0.288 [2, 5000] loss: 0.285 [2, 6000] loss: 0.288 Finished Training 2.4.4 保存模型---Fashion-MNISt-CNN.py第8部分
### 1.8 保存模型torch.save(network.state_dict(),./models/CNNFashionMNist.PTH)
2.5 加载模型并进行预测
2.5.1 加载模型并预测代码实现 ---Fashion-MNISt-CNN.py第9部分
### 1.9 加载模型并且使用该模型进行预测network.load_state_dict(torch.load(./models/CNNFashionMNist.PTH)) # 加载模型# 使用模型dataiter iter(test_loader) # 获取测试数据images, labels dataiter.next()inputs, labels images.to(device), labels.to(device)imshow(torchvision.utils.make_grid(images, nrowbatch_size)) # 取出一批数据进行展示print(真实标签: , .join(%5s % classes[labels[j]] for j in range(len(images))))# 输出真实标签: Ankle_Boot Pullover Trouser Trouser Shirt Trouser Coat Shirt Sandal Sneakeroutputs network(inputs) # 调用network对输入样本进行预测得到测试结果outputs_, predicted torch.max(outputs, 1) # 对于预测结果outputs沿着第1维度找出最大值及其索引值该索引值即为预测的分类结果print(预测结果: , .join(%5s % classes[predicted[j]] for j in range(len(images))))# 输出预测结果: Ankle_Boot Pullover Trouser Trouser Pullover Trouser Shirt Shirt Sandal Sneaker 输出 图片形状 torch.Size([3, 32, 302]) 真实标签: Ankle_Boot Pullover Trouser Trouser Shirt Trouser Coat Shirt Sandal Sneaker 预测结果: Ankle_Boot Pullover Trouser Trouser Shirt Trouser Pullover Shirt Sandal Sneaker 2.6 评估模型
2.6.1 评估模型的作用 对于模型的能力进行一个精确的评估需要对每一个分类的精度进行量化计算 2.6.2 评估模型代码实现
### 1.10 评估模型# 测试模型class_correct list(0. for i in range(10)) # 定义列表收集每个类的正确个数class_total list(0. for i in range(10)) # 定义列表收集每个类的总个数with torch.no_grad():for data in test_loader: # 遍历测试数据集images, labels datainputs, labels images.to(device), labels.to(device)outputs network(inputs) # 将每个批次的数据输入模型_, predicted torch.max(outputs, 1) # 计算预测结果predicted predicted.to(device)c (predicted labels).squeeze() # 统计正确的个数for i in range(10): # 遍历所有类别label labels[i]class_correct[label] class_correct[label] c[i].item() # 若该类别正确则1class_total[label] class_total[label] 1 # 根据标签中的类别计算类的总数sumacc 0for i in range(10): # 输出每个类的预测结果Accuracy 100 * class_correct[i] / class_total[i]print(Accuracy of %5s : %2d %% % (classes[i], Accuracy))sumacc sumacc Accuracyprint(Accuracy of all : %2d %% % (sumacc / 10.)) # 输出最终的准确率 输出 Accuracy of T-shirt : 70 % Accuracy of Trouser : 91 % Accuracy of Pullover : 77 % Accuracy of Dress : 81 % Accuracy of Coat : 64 % Accuracy of Sandal : 89 % Accuracy of Shirt : 50 % Accuracy of Sneaker : 90 % Accuracy of Bag : 94 % Accuracy of Ankle_Boot : 95 % Accuracy of all : 80 % 2.6.3 Tip
模型的测试结果只是一个模型能力的参考值它并不能完全反映模型的真实情况。这取决于训练样本和测试样本的分布情况也取决于摸型本身的拟合质量。在计算机上运行代码时得到的值可能的值不一样甚至每次运行时得到的值也不一样这是因为每次初始的权重w是随机的。由于初始权重不同而且每次训练的批次数据也不同因此最终生成的模型也不会完全相同。但如果核心算法一致那么会保证最终的结果不会有太大的偏差。
3 识别黑白图中的服装图案总览
import torchvision
import torchvision.transforms as transforms
import pylab
import torch
from matplotlib import pyplot as plt
import torch.utils.data
import torch.nn.functional as F
import numpy as np
import os
os.environ[KMP_DUPLICATE_LIB_OK]TRUE# 定义显示图像的函数
def imshow(img):print(图片形状,np.shape(img))img img/2 0.5npimg img.numpy()plt.axis(off)plt.imshow(np.transpose(npimg,(1,2,0)))### 1.1 自动下载FashionMNIST数据集
data_dir ./fashion_mnist # 设置存放位置
transform transforms.Compose([transforms.ToTensor()]) # 可以自动将图片转化为Pytorch支持的形状[通道高宽]同时也将图片的数值归一化
train_dataset torchvision.datasets.FashionMNIST(data_dir,trainTrue,transformtransform,downloadTrue)
print(训练集的条数,len(train_dataset))### 1.2 读取及显示FashionMNIST数据集中的数据
val_dataset torchvision.datasets.FashionMNIST(rootdata_dir,trainFalse,transformtransform)
print(测试集的条数,len(val_dataset))
##1.2.1 显示数据集中的数据
im train_dataset[0][0].numpy()
im im.reshape(-1,28)
pylab.imshow(im)
pylab.show()
print(当前图片的标签为,train_dataset[0][1])### 1.3 按批次封装FashionMNIST数据集
batch_size 10 #设置批次大小
train_loader torch.utils.data.DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue)
test_loader torch.utils.data.DataLoader(val_dataset, batch_sizebatch_size, shuffleFalse)### 1.4 读取批次数据集
## 定义类别名称
classes (T-shirt, Trouser, Pullover, Dress, Coat, Sandal, Shirt, Sneaker, Bag, Ankle_Boot)
sample iter(train_loader) # 将数据集转化成迭代器
images,labels sample.next() # 从迭代器中取得一批数据
print(样本形状,np.shape(images)) # 打印样本形状
# 输出 样本形状 torch.Size([10, 1, 28, 28])
print(样本标签,labels)
# 输出 图片形状 torch.Size([3, 32, 302])
imshow(torchvision.utils.make_grid(images,nrow batch_size)) # 数据可视化make_grid()将该批次的图片内容组合为一个图片用于显示nrow用于设置生成图片中每行的样本数量
print(,.join(%5s % classes[labels[j]] for j in range(len(images))))
# 输出 Trouser,Trouser,Dress, Bag,Shirt,Sandal,Shirt,Dress, Bag, Bag### 1.5 定义模型类
class myConNet(torch.nn.Module):def __init__(self):super(myConNet, self).__init__()# 定义卷积层self.conv1 torch.nn.Conv2d(in_channels 1 ,out_channels 6,kernel_size 5)self.conv2 torch.nn.Conv2d(in_channels 6,out_channels 12,kernel_size 5)# 定义全连接层self.fc1 torch.nn.Linear(in_features 12*4*4,out_features 120)self.fc2 torch.nn.Linear(in_features 120,out_features 60)self.out torch.nn.Linear(in_features 60,out_features 10) # 10是固定的因为必须要和模型所需要的分类个数一致def forward(self,t):# 第一层卷积和池化处理t self.conv1(t)t F.relu(t)t F.max_pool2d(t, kernel_size2, stride2)# 第二层卷积和池化处理t self.conv2(t)t F.relu(t)t F.max_pool2d(t, kernel_size2, stride2)# 搭建全连接网络第一层全连接t t.reshape(-1, 12 * 4 * 4) # 将卷积结果由4维变为2维t self.fc1(t)t F.relu(t)# 第二层全连接t self.fc2(t)t F.relu(t)# 第三层全连接t self.out(t)return t
if __name__ __main__:network myConNet() # 生成自定义模块的实例化对象#指定设备device torch.device(cuda:0if torch.cuda.is_available() else cpu)print(device)network.to(device)print(network) # 打印myConNet网络
### 1.6 损失函数与优化器criterion torch.nn.CrossEntropyLoss() #实例化损失函数类optimizer torch.optim.Adam(network.parameters(), lr.01)
### 1.7 训练模型for epoch in range(2): # 数据集迭代2次running_loss 0.0for i, data in enumerate(train_loader, 0): # 循环取出批次数据 使用enumerate()函数对循环计数第二个参数为0表示从0开始inputs, labels datainputs, labels inputs.to(device), labels.to(device) #optimizer.zero_grad() # 清空之前的梯度outputs network(inputs)loss criterion(outputs, labels) # 计算损失loss.backward() # 反向传播optimizer.step() # 更新参数running_loss loss.item()### 训练过程的显示if i % 1000 999:print([%d, %5d] loss: %.3f %(epoch 1, i 1, running_loss / 2000))running_loss 0.0print(Finished Training)
### 1.8 保存模型torch.save(network.state_dict(),./models/CNNFashionMNist.PTH)### 1.9 加载模型并且使用该模型进行预测network.load_state_dict(torch.load(./models/CNNFashionMNist.PTH)) # 加载模型# 使用模型dataiter iter(test_loader) # 获取测试数据images, labels dataiter.next()inputs, labels images.to(device), labels.to(device)imshow(torchvision.utils.make_grid(images, nrowbatch_size)) # 取出一批数据进行展示print(真实标签: , .join(%5s % classes[labels[j]] for j in range(len(images))))# 输出真实标签: Ankle_Boot Pullover Trouser Trouser Shirt Trouser Coat Shirt Sandal Sneakeroutputs network(inputs) # 调用network对输入样本进行预测得到测试结果outputs_, predicted torch.max(outputs, 1) # 对于预测结果outputs沿着第1维度找出最大值及其索引值该索引值即为预测的分类结果print(预测结果: , .join(%5s % classes[predicted[j]] for j in range(len(images))))# 输出预测结果: Ankle_Boot Pullover Trouser Trouser Pullover Trouser Shirt Shirt Sandal Sneaker### 1.10 评估模型# 测试模型class_correct list(0. for i in range(10)) # 定义列表收集每个类的正确个数class_total list(0. for i in range(10)) # 定义列表收集每个类的总个数with torch.no_grad():for data in test_loader: # 遍历测试数据集images, labels datainputs, labels images.to(device), labels.to(device)outputs network(inputs) # 将每个批次的数据输入模型_, predicted torch.max(outputs, 1) # 计算预测结果predicted predicted.to(device)c (predicted labels).squeeze() # 统计正确的个数for i in range(10): # 遍历所有类别label labels[i]class_correct[label] class_correct[label] c[i].item() # 若该类别正确则1class_total[label] class_total[label] 1 # 根据标签中的类别计算类的总数sumacc 0for i in range(10): # 输出每个类的预测结果Accuracy 100 * class_correct[i] / class_total[i]print(Accuracy of %5s : %2d %% % (classes[i], Accuracy))sumacc sumacc Accuracyprint(Accuracy of all : %2d %% % (sumacc / 10.)) # 输出最终的准确率