当前位置: 首页 > news >正文

深度学习实战模拟——softmax回归(图像识别并分类)

目录

1、数据集:

2、完整代码


1、数据集:

1.1 Fashion-MNIST是一个服装分类数据集,由10个类别的图像组成,分别为t-shirt(T恤)、trouser(裤子)、pullover(套衫)、dress(连衣裙)、coat(外套)、sandal(凉鞋)、shirt(衬衫)、sneaker(运动鞋)、bag(包)和ankle boot(短靴)。

1.2 Fashion‐MNIST由10个类别的图像组成,每个类别由训练数据集(train dataset)中的6000张图像和测试数据 集(test dataset)中的1000张图像组成。因此,训练集和测试集分别包含60000和10000张图像。测试数据集 不会用于训练,只用于评估模型性能。

以下函数用于在数字标签索引及其文本名称之间进行转换。

# 通过ToTensor实例将图像数据从PIL类型变换成32位浮点数格式,
# 并除以255使得所有像素的数值均在0~1之间
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)

以下函数用于在数字标签索引及其文本名称之间进行转换。

def get_fashion_mnist_labels(labels):  #@save"""返回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]

2、完整代码

import torch
import torchvision
import pylab
from torch.utils import data
from torchvision import transforms
import matplotlib.pyplot as plt
from d2l import torch as d2l
import timebatch_size = 256
num_inputs = 784
num_outputs = 10
W = torch.normal(0, 0.01, size=(num_inputs, num_outputs), requires_grad=True)
b = torch.zeros(num_outputs, requires_grad=True)
num_epochs = 5class Accumulator:"""在n个变量上累加"""def __init__(self, n):self.data = [0.0] * ndef add(self, *args):self.data = [a + float(b) for a, b in zip(self.data, args)]def reset(self):self.data = [0.0] * len(self.data)def __getitem__(self, idx):return self.data[idx]def accuracy(y_hat, y):  #@save"""计算预测正确的数量"""if len(y_hat.shape) > 1 and y_hat.shape[1] > 1:y_hat = y_hat.argmax(axis=1)cmp = y_hat.type(y.dtype) == yreturn float(cmp.type(y.dtype).sum())def cross_entropy(y_hat, y):return -torch.log(y_hat[range(len(y_hat)), y])def softmax(X):X_exp = torch.exp(X)partition = X_exp.sum(1, keepdim=True)return X_exp/partitiondef net(X):return softmax(torch.matmul(X.reshape((-1, W.shape[0])), W) + b)def get_dataloader_workers():"""使用一个进程来读取的数据"""return 1def get_fashion_mnist_labels(labels):"""返回Fashion-MNIST数据集的文本标签"""#共10个类别text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat', 'sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']return [text_labels[int(i)] for i in labels]def show_images(imgs, num_rows, num_cols, titles=None, scale=1.5):"""画一系列图片"""figsize = (num_cols * scale, num_rows * scale)_, axes = plt.subplots(num_rows, num_cols, figsize=figsize)for i, (img, label) in enumerate(zip(imgs, titles)):xloc, yloc = i//num_cols, i % num_colsif torch.is_tensor(img):# 图片张量axes[xloc, yloc].imshow(img.reshape((28, 28)).numpy())else:# PIL图片axes[xloc, yloc].imshow(img)# 设置标题并取消横纵坐标上的刻度axes[xloc, yloc].set_title(label)plt.xticks([], ())axes[xloc, yloc].set_axis_off()pylab.show()def load_data_fashion_mnist(batch_size, resize=None):"""下载Fashion-MNIST数据集,然后将其加载到内存中"""trans = transforms.ToTensor()if resize:trans.insert(0, transforms.Resize(resize))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_test, batch_size, shuffle=False, num_workers=get_dataloader_workers()))def evaluate_accuracy(net, data_iter):"""计算在指定数据集上模型的精度"""if isinstance(net, torch.nn.Module):net.eval()  # 将模型设置为评估模式metric = Accumulator(2)  # 正确预测数、预测总数with torch.no_grad():for X, y in data_iter:metric.add(accuracy(net(X), y), y.numel())return metric[0] / metric[1]def updater(batch_size):lr = 0.1return d2l.sgd([W, b], lr, batch_size)def train_epoch_ch3(net, train_iter, loss, updater):if isinstance(net, torch.nn.Module):net.train()metric = Accumulator(3)for X, y in train_iter:y_hat = net(X)lo = loss(y_hat, y)if isinstance(updater, torch.optim.Optimizer):updater.zero_grad()lo.backward()updater.step()metric.add(float(lo)*len(y), accuracy(y_hat, y), y.size().numel())else:lo.sum().backward()updater(X.shape[0])metric.add(float(lo.sum()), accuracy(y_hat, y), y.numel())return metric[0] / metric[2], metric[1] / metric[2]class Animator:  #@save"""绘制数据"""def __init__(self, legend=None):self.legend = legendself.X = [[], [], []]self.Y = [[], [], []]def add(self, x, y):# 向图表中添加多个数据点if not hasattr(y, "__len__"):y = [y]n = len(y)if not hasattr(x, "__len__"):x = [x] * nfor i, (a, b) in enumerate(zip(x, y)):if a is not None and b is not None:self.X[i].append(a)self.Y[i].append(b)def show(self):plt.plot(self.X[0], self.Y[0], 'r--')plt.plot(self.X[1], self.Y[1], 'g--')plt.plot(self.X[2], self.Y[2], 'b--')plt.legend(self.legend)plt.xlabel('epoch')plt.ylabel('value')plt.title('Visual')plt.show()def train_ch3(net, train_iter, test_iter, loss, num_epochs, updater):  #@save"""训练模型"""animator = Animator(legend=['train loss', 'train acc', 'test acc'])for epoch in range(num_epochs):train_metrics = train_epoch_ch3(net, train_iter, loss, updater)train_loss, train_acc = train_metricstest_acc = evaluate_accuracy(net, test_iter)animator.add(epoch + 1, train_metrics + (test_acc,))print(f'epoch: {epoch+1},train_loss:{train_loss:.4f}, train_acc:{train_acc:.4f}, test_acc:{test_acc:.4f}')animator.show()def predict_ch3(net, test_iter, n=12):"""预测标签"""for X, y in test_iter:breaktrues = d2l.get_fashion_mnist_labels(y)preds = d2l.get_fashion_mnist_labels(net(X).argmax(axis=1))titles = [true +'\n' + pred for true, pred in zip(trues, preds)]show_images(X[0:n].reshape((n, 28, 28)), 2, int(n/2), titles=titles[0:n])if __name__ == '__main__':train_iter, test_iter = load_data_fashion_mnist(batch_size)train_ch3(net, train_iter, test_iter, cross_entropy, num_epochs, updater)predict_ch3(net, test_iter)

分类效果:

相关文章:

  • 信号处理--基于正则化聚合的共空间模态(CSP)脑电信号分类
  • 计算机视觉之三维重建(1)---摄像机几何
  • Python QT 之PySide6简单入门
  • 获取分时计算的小时数据
  • ocp考试是中文还是英文?ocp认证好考吗
  • Css提高——Css3的新增选择器
  • 使用uniapp,uni-data-select组件时,内容长度没超过容器宽度时候虽然能显示全内容但是数据后边会出现三个点,逼死强迫症
  • 24计算机考研调剂 | 集美大学(11408)
  • 在基于全志V851se的TinyVision上手动构建 Linux 6.1 + Debian 12 镜像
  • phpStudy安装thinkCMF8时,如何解决服务器rewrite和APIrewrite不支持的问题
  • 【Python 48小时速成 1】单下划线与双下划线的作用
  • 读算法的陷阱:超级平台、算法垄断与场景欺骗笔记14_友和敌
  • EDI在汽车主机厂配送流程中的应用
  • 深度学习_ResNet_5
  • 绝地求生:受到封禁三天的玩家,静待解封即可!官方暂未发布系误封公告
  • [译]Python中的类属性与实例属性的区别
  • CSS居中完全指南——构建CSS居中决策树
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • JavaScript的使用你知道几种?(上)
  • Java深入 - 深入理解Java集合
  • Js基础知识(四) - js运行原理与机制
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • oldjun 检测网站的经验
  • python docx文档转html页面
  • React Native移动开发实战-3-实现页面间的数据传递
  • 百度地图API标注+时间轴组件
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 关于springcloud Gateway中的限流
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 两列自适应布局方案整理
  • 批量截取pdf文件
  • 区块链技术特点之去中心化特性
  • 使用putty远程连接linux
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 想写好前端,先练好内功
  • 一道闭包题引发的思考
  • 智能合约Solidity教程-事件和日志(一)
  • - 转 Ext2.0 form使用实例
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # C++之functional库用法整理
  • #{} 和 ${}区别
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (转)Google的Objective-C编码规范
  • ***详解账号泄露:全球约1亿用户已泄露
  • .chm格式文件如何阅读
  • .Net - 类的介绍
  • .Net Core与存储过程(一)
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth