Hello World!

 一、minist数据集

深度学习编程特有的hello world程序:采用minist数据集完成意向特定深度学习项目

1、minist数据集介绍

MNIST数据集是一个广泛使用的手写数字识别数据集,它包含了许多不同人手写的数字图片。这个数据集被广泛用于研究手写数字识别,是深度学习领域的一个典型应用。

一共包含四个文件夹:
train-images-idx3-ubyte.gz:训练集图像(9912422 字节)55000张训练集 + 5000张验证集;
train-labels-idx1-ubyte.gz:训练集标签(28881 字节)训练集对应的标签;
t10k-images-idx3-ubyte.gz:测试集图像(1648877 字节)10000张测试集;
t10k-labels-idx1-ubyte.gz:测试集标签(4542 字节)测试集对应的标签;

2、下载

如果你手头有《从零开始大模型开发与微调》这本书,随书附赠的代码中就有这个数据集,如果你有但也想尝试自行处理数据,就可以跟着看下去。

进入官网、四个链接分别下载进一个文件夹里、解压(我用的是7z解压)

MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges

3、读取文件

鉴于idx-udyte文件的特殊性,我们需要一些特殊的方法读取文件中的数据:

以数据集的idx3-udyte为例,idx3-udyte文件的数据都是二进制数、由四个32位数组成的表头和具体数据组成。其中表头的四个32位数分别是魔数和第三维、行、列的数目。同理idx1-udyte由两个32位数组成表头,魔数和第三维的数目。

既然已经知道了他的格式,我们就可以进行读取:

读取方法参考(照搬)了该文章:  数据集解析 001:MNIST数据集与IDX文件(附带IDX文件提取代码Python版)_fmt_header = '>iiii-CSDN博客

首先是将文件以二进制的方式读取出:

with open('MNIST/train-images.idx3-ubyte', 'rb') as f:content = f.read()
# print(content)

然后通过struct模块的unpack_from()方法提取表头:

fmt_header = '>iiii'   
offset = 0
# 从偏移量位0的位置开始读取四个整型(4字节32位)
magic_number, num_images, num_rows, num_cols = struct.unpack_from(fmt_header, content, offset)
print ('幻数:%d, 图片数量: %d张, 图片大小: %d*%d' % (magic_number, num_images, num_rows, num_cols))

struct.unpack_from() 这个方法用一句话概括其功能就是:从某个文件中以特定的格式读取出相应的数据。至于fmt_header、offset这些都是提取时使用的参数,具体含义想理解的可以自行学习理解。

之后读取除了表头以外的其他数据:

剩下的数据,就是n多个x行y列的图片数据、图片数据本质上就是一个三维数组、我们的工作就是将这些实质上是三维数组的数据存储成真正的三维数组

#定义一张图片需要的数据个数(每个像素一个字节,共需要行*列个字节的数据)
img_size = num_rows*num_cols
#struct.calcsize(fmt)用来计算fmt格式所描述的结构的大小
offset += struct.calcsize(fmt_header)
# '>784B'是指用大端法读取784个unsigned byte
fmt_image = '>' + str(img_size) + 'B'
#定义了一个三维数组,这个数组共有num_images个 num_rows*num_cols尺寸的矩阵。
images = np.empty((num_images, num_rows, num_cols))for i in range(num_images):images[i] = np.array(struct.unpack_from(fmt_image, content, offset)).reshape((num_rows,num_cols))offset += struct.calcsize(fmt_image)
# print(images[0])   # 输出一个样例

用到的函数有:

备注:struct.calcsize()>
备注:<np.empty()>详解
备注:<np.array()>详解
备注:<np.reshape()>详解

4、举一反三:

已知如何读取idx3-udyte类型的数据,那么我们就可以举一反三相对应的写出idx1-udyte类型的数据,并把这两个方法放入同一个类中

import struct
import numpy as np
"""
ReadData类,其中有两个方法read_data()
read_data1()  输入一个路径参数roadurl,返回该idx1-udata
read_data3()  输入一个路径参数roadurl,返回该idx3-udata
"""class ReadData():def read_data1(self, roadurl):with open(roadurl, 'rb') as f:content = f.read()# print(content)fmt_header = '>ii'  # 网络字节序offset = 0magic_number, num_images= struct.unpack_from(fmt_header, content, offset)print('幻数:%d, 图片数量: %d张' % (magic_number, num_images))# 图片的标签是一个int类型变量。img_size = 1# struct.calcsize(fmt)用来计算fmt格式所描述的结构的大小offset += struct.calcsize(fmt_header)# '>1B'是指用大端法读取1个unsigned bytefmt_image = '>' + str(img_size) + 'B'# 定义了一个数组,这个数组共有num_images个图片标签。images = np.empty(num_images)for i in range(num_images):images[i] = np.array(struct.unpack_from(fmt_image, content, offset))offset += struct.calcsize(fmt_image)return images"""ReadData类,其中只有一个方法read_data()"""def read_data3(self, roadurl):with open(roadurl, 'rb') as f:content = f.read()# print(content)fmt_header = '>iiii'  # 网络字节序offset = 0magic_number, num_images, num_rows, num_cols = struct.unpack_from(fmt_header, content, offset)print('幻数:%d, 图片数量: %d张, 图片大小: %d*%d' % (magic_number, num_images, num_rows, num_cols))# 定义一张图片需要的数据个数(每个像素一个字节,共需要行*列个字节的数据)img_size = num_rows * num_cols# struct.calcsize(fmt)用来计算fmt格式所描述的结构的大小offset += struct.calcsize(fmt_header)# '>784B'是指用大端法读取784个unsigned bytefmt_image = '>' + str(img_size) + 'B'# 定义了一个三维数组,这个数组共有num_images个 num_rows*num_cols尺寸的矩阵。images = np.empty((num_images, num_rows, num_cols))for i in range(num_images):images[i] = np.array(struct.unpack_from(fmt_image, content, offset)).reshape((num_rows, num_cols))offset += struct.calcsize(fmt_image)return images# 试运行一下看一看
if __name__ == '__main__':a = ReadData()print(a.read_data1("train-labels.idx1-ubyte"))

至此我们已经完成了数据的前期处理,接下来就需要请出大模型了。

二、大模型

1、选择模型

作为helloworld级别的程序,我们不需要去了解具体怎么选择模型,你只需要知道我们这里使用的是Unet模型即可。这是一种输入和输出的大小维度都相同的模型。

2、Unet模型的整体结构

import torchclass Unet(torch.nn.Module):def __init__(self):super(Unet, self).__init__()# 模块化结构,这也是后面常用到的模型结构self.first_block_down = torch.nn.Sequential(torch.nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, padding=1), torch.nn.GELU(),torch.nn.MaxPool2d(kernel_size=2, stride=2))self.second_block_down = torch.nn.Sequential(torch.nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, padding=1), torch.nn.GELU(),torch.nn.MaxPool2d(kernel_size=2, stride=2))self.latent_space_block = torch.nn.Sequential(torch.nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, padding=1), torch.nn.GELU(),)self.second_block_up = torch.nn.Sequential(torch.nn.Upsample(scale_factor=2),torch.nn.Conv2d(in_channels=128, out_channels=64, kernel_size=3, padding=1), torch.nn.GELU(),)self.first_block_up = torch.nn.Sequential(torch.nn.Upsample(scale_factor=2),torch.nn.Conv2d(in_channels=64, out_channels=32, kernel_size=3, padding=1), torch.nn.GELU(),)self.convUP_end = torch.nn.Sequential(torch.nn.Conv2d(in_channels=32, out_channels=1, kernel_size=3, padding=1),torch.nn.Tanh())def forward(self, img_tensor):image = img_tensorimage = self.first_block_down(image)  # ;print(image.shape)     # torch.Size([5, 32, 14, 14])image = self.second_block_down(image)  # ;print(image.shape)    # torch.Size([5, 16, 7, 7])image = self.latent_space_block(image)  # ;print(image.shape)   # torch.Size([5, 8, 7, 7])image = self.second_block_up(image)  # ;print(image.shape)      # torch.Size([5, 16, 14, 14])image = self.first_block_up(image)  # ;print(image.shape)       # torch.Size([5, 32, 28, 28])image = self.convUP_end(image)  # ;print(image.shape)           # torch.Size([5, 32, 28, 28])return imageif __name__ == '__main__':image = torch.randn(size=(5, 1, 28, 28))unet_model = Unet()torch.save(unet_model, './unet_model.pth')

3、模型的损失函数与优化函数

损失函数的主要目的是评估模型的预测结果与实际结果之间的不一致程度,优化函数是用来指导模型如何通过调整参数来最小化损失函数的函数。

简而言之,损失函数评估模型准确率的,优化函数是提高模型准确率的。

损失函数就是在样本集中选一批数据,然后只给输入让模型给输出,然后根据输出与样本集的标签作对比得出一个数值,这个数值越小越好。我们这里使用的是均方损失函数MSEless

        # 模型的损失函数pred = model(x_imgs_batch)  # 对模型进行正向计算loss = torch.nn.MSELoss(reduction="sum")(pred, y_batch) * 100.  # 使用损失函数进行计算

优化函数同理不在讲解,这里选择的是adam优化器。我们只需要知道这些都是很重要的内容即可

optimizer = torch.optim.Adam(model.parameters(), lr=2e-5)  # 设定优化函数,学习率为lr

 4、模型训练参数

先介绍他的一些主要内容:

导入数据集方法的调用:

# 载入数据 如果你使用这里给的数据集可以用这个方法
x_train = np.load("../dataset/mnist/x_train.npy")
y_train_label = np.load("../dataset/mnist/y_train_label.npy")
# 如果用的是自己找的数据集则要用
x_train = rdOne.read_data3("G:/机械学习/数据集/minist/MNIST/train-images.idx3-ubyte")
y_train_label = rdOne.read_data1("G:/机械学习/数据集/minist/MNIST/train-labels.idx1-ubyte")

报错:“ AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘ “:

# import matplotlib.puplot as plt
import matplotlib
# 切换为图形界面显示的终端TkAgg
matplotlib.use('TkAgg')
# 导入matplotlib的pyplot
import matplotlib.pyplot as plt

5、基于深度学习的模型训练

import osos.environ['CUDA_VISIBLE_DEVICES'] = '0'  # 指定GPU编
import torch
import numpy as np
import unet
from tqdm import tqdmfrom read_data import ReadData as rdOne
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
# 切换为图形界面显示的终端TkAgg
# 导入matplotlib的pyplotbatch_size = 320  # 设定每次训练的批次数
epochs = 1024  # 设定训练次数# device = "cpu"                         #Pytorch的特性,需要指定计算的硬件,如果没有GPU的存在,就使用CPU进行计算
device = "cuda"  # 在这里读者默认使用GPU,如果读者出现运行问题可以将其改成cpu模式model = unet.Unet()  # 导入Unet模型
model = model.to(device)  # 将计算模型传入GPU硬件等待计算
# model = torch.compile(model)            #Pytorch2.0的特性,加速计算速度 选择使用内容
optimizer = torch.optim.Adam(model.parameters(), lr=2e-5)  # 设定优化函数,学习率为lr# 载入数据 如果你使用这里给的数据集可以用这个方法
# x_train = np.load("../dataset/mnist/x_train.npy")
# y_train_label = np.load("../dataset/mnist/y_train_label.npy")
# 如果用的是自己找的数据集则要用
x_train = rdOne.read_data3("G:/机械学习/数据集/minist/MNIST/train-images.idx3-ubyte")
y_train_label = rdOne.read_data1("G:/机械学习/数据集/minist/MNIST/train-labels.idx1-ubyte")x_train_batch = []
for i in range(len(y_train_label)):if y_train_label[i] <= 10:  # 为了加速演示作者只对数据集中的小于2的数字,也就是0和1进行运行,读者可以自行增加训练个数x_train_batch.append(x_train[i])x_train = np.reshape(x_train_batch, [-1, 1, 28, 28])  # 修正数据输入维度:([30596, 28, 28])
x_train /= 512.
train_length = len(x_train) * 20  # 增加数据的单词循环次数# state_dict = torch.load("./saver/unet.pth")
# model.load_state_dict(state_dict)
for epoch in range(30): # 循环30次train_num = train_length // batch_size  # 计算有多少批次数train_loss = 0  # 用于损失函数的统计for i in tqdm(range(train_num)):  # 开始循环训练x_imgs_batch = []  # 创建数据的临时存储位置x_step_batch = []y_batch = []# 对每个批次内的数据进行处理for b in range(batch_size):img = x_train[np.random.randint(x_train.shape[0])]  # 提取单个图片内容x = imgy = imgx_imgs_batch.append(x)y_batch.append(y)# 将批次数据转化为Pytorch对应的tensor格式并将其传入GPU中x_imgs_batch = torch.tensor(x_imgs_batch).float().to(device)y_batch = torch.tensor(y_batch).float().to(device)# 模型的损失函数pred = model(x_imgs_batch)  # 对模型进行正向计算loss = torch.nn.MSELoss(reduction="sum")(pred, y_batch) * 100.  # 使用损失函数进行计算# 这里读者记住下面就是固定格式,一般而言这样使用即可optimizer.zero_grad()  # 对结果进行优化计算loss.backward()  # 损失值的反向传播optimizer.step()  # 对参数进行更新train_loss += loss.item()  # 记录每个批次的损失值# 计算并打印损失值train_loss /= train_numprint("train_loss:", train_loss)if epoch % 6 == 0:torch.save(model.state_dict(), "./saver/unet.pth")# 下面是对数据进行打印image = x_train[np.random.randint(x_train.shape[0])]  # 随机挑选一条数据进行计算image = np.reshape(image, [1, 1, 28, 28])  # 修正数据维度image = torch.tensor(image).float().to(device)  # 挑选的数据传入硬件中等待计算image = model(image)  # 使用模型对数据进行计算image = torch.reshape(image, shape=[28, 28])  # 修正模型输出结果image = image.detach().cpu().numpy()  # 将计算结果导入CPU中进行后续计算或者展示# 展示或计算数据结果plt.imshow(image)plt.savefig(f"./img/img_{epoch}.jpg")

三、总结

1、文件总览

共有:

1个img文件夹用以存储图片文件

1个saver文件夹用以存储模型

1个read_data.py文件:功能是读取idx3-udyte数据

1个train.py文件:功能是训练模型

1个Unet.py文件:unet模型

2、训练结果

完整的训练时间可能需要很久,这里只训练了很短的时间,所以只出了部分结果。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/200876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过keepalived+nginx实现 k8s apiserver节点高可用

一、环境准备 K8s 主机配置&#xff1a; 配置&#xff1a; 4Gib 内存/4vCPU/60G 硬盘 网络&#xff1a;机器相互可以通信 k8s 实验环境网络规划&#xff1a; podSubnet&#xff08;pod 网段&#xff09; 10.244.0.0/16 serviceSubnet&#xff08;service 网段&#xff09;: 1…

【S32K3环境搭建】-0.2-安装S32DS product updates和 packages

目录 1 安装S32DS product updates和 packages 1.1 方法一&#xff1a;通过S32DS Extensions and Updates安装product updates和 packages 1.2 方法二&#xff1a;通过Install New Software…安装product updates和 packages 2 S32DS product updates和 packages安装后的效…

海外服务器和国内服务器有什么样的区别呢

海外服务器和国内服务器有什么样的区别呢&#xff0c;其实呢在外形方面是大同小异&#xff0c;除了外形还有一些其他方面还存在这一些差异。 一&#xff0c;地理位置的差异。 海外服务器——有可能在中国数据中心之外的任何国家地区&#xff0c;例如美国服务器&#xff0c;韩…

视频汇聚/音视频流媒体视频平台/视频监控EasyCVR分享页面无法播放,该如何解决?

国标GB28181安防视频监控/视频集中存储/云存储EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统…

PRCD-1229 : An attempt to access configuration of database

今天维护oda一体机时&#xff0c;发现无法在grid用户下面关闭数据库实例&#xff0c;如下 ASM1:/home/gridoda0>srvctl stop database -d orcl -o immeidate PRCD-1229 : An attempt to access configuration of database orcl was rejected because its version 11.2.0.4.…

dockerdesktop推送镜像到dockerhub

1.查看镜像(打开powershell) docker ps2.打tag docker tag pengzx/aspnetcoredocker:v1 pengzx/aspnetcoredocker:v2pengzx/aspnetcoredocker:v1:本地的镜像名加版本号 pengzx/aspnetcoredocker:v2&#xff1a;需要上传的镜像名&#xff08;要以dockerhub的用户名开头/本地镜像…

软著项目推荐 深度学习的智能中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分&#xff1a;4.2 损失函数&#xff1a;4.3 搭建seq2seq框架&#xff1a;4.4 测试部分&#xff1a;4.5 评价NLP测试效果&#xff1a;4.6 梯度截断…

【工作生活】汽车电子嵌入式开发简介

目录 1. 目标 2. 要分享什么 3.1 行业知识 3.1.1车载行业知识&#xff1a; 3.1.2项目&#xff1a; 3.1.3开发测试工具&#xff1a; 3.2 硬件平台 3.3 基础知识 3.4 工作生活 3. 我们是谁 1. 目标 随着新能源汽车的快速崛起&#xff0c;汽车电子行业开始快速发展&…

掌控安全 暖冬杯 CTF Writeup By AheadSec

本来结束时发到了学校AheadSec的群里面了的&#xff0c;觉得这比赛没啥好外发WP的&#xff0c;但是有些师傅来问了&#xff0c;所以还是发一下吧。 文章目录 Web签到&#xff1a;又一个计算题计算器PHP反序列化又一个PHP反序列化 Misc这是邹节伦的桌面背景图什么鬼&#xff1f;…

基于STM32 HAL库的光电传感器驱动程序实例

本文将使用STM32 HAL库编写一个光电传感器的驱动程序示例。首先&#xff0c;我们会介绍光电传感器的工作原理和应用场景。然后&#xff0c;我们将讲解如何选择合适的STM32芯片和光电传感器组合。接下来&#xff0c;我们会详细介绍使用STM32 HAL库编写光电传感器驱动程序的基本步…

Kafka 生产者 API 指南:深入理解生产者的实现与最佳实践

Kafka 是一个高性能、分布式的消息中间件系统&#xff0c;而其生产者 API 是连接应用程序与 Kafka 集群之间的纽带。本篇博客将深入探讨 Kafka 生产者 API 的核心概念、用法&#xff0c;以及一些最佳实践&#xff0c;帮助你更好地利用 Kafka 构建可靠的消息生产系统。 1. Kafk…

一:对爬虫的简单认识

一&#xff1a;爬虫前导知识 1.爬虫引入&#xff1a; ​ 网络爬虫又称为网络蜘蛛&#xff1b;网络蚂蚁&#xff1b;网络机器人等&#xff0c;可以自动高效地从互联网的海量信息中浏览获取到我们感兴趣的信息&#xff0c;在浏览信息的时候需要按照我们制定的规则进行&#xff…

解决:docx.opc.exceptions.PackageNotFoundError: Package not found at ‘xxx’

解决&#xff1a;docx.opc.exceptions.PackageNotFoundError: Package not found at ‘xxx’ 文章目录 解决&#xff1a;docx.opc.exceptions.PackageNotFoundError: Package not found at ‘xxx’背景报错问题报错翻译报错位置代码报错原因解决方法参考内容今天的分享就到此结…

基础课17——任务问答引擎

任务问答引擎在智能客服系统中负责多轮对话的对话流设计、意图的管理、任务流的执行等功能。能够高效地进行意图识别与任务解析&#xff0c;实现多轮对话的流程设计&#xff0c;并驱动多轮会话任务的高效完成。 1.定义 任务问答引擎负责多轮对话的对话流设计、意图的管理、任…

如何选呼叫中心的语音通道?

如何选呼叫中心的语音通道&#xff1f; 在公网语音线路和专线语音线路中&#xff0c;选择合适的语音通道类型需要根据呼叫中心的实际需求进行综合考虑。 如果呼叫中心的预算有限&#xff0c;或者对语音质量和稳定性的要求不高&#xff0c;可以选择公网语音线路。如果需要更高…

dante(centos)安装

下载安装包 https://www.inet.no/dante/doc/latest/config/index.html 下载软件 解压 tar -zxvf dante-1.4.3.tar.gz 或者 wget http://www.inet.no/dante/files/dante-1.4.3.tar.gz tar -xvzf dante-1.4.3.tar.gz 编译 cd dante-1.4.3 yum install gcc make -y ##编译必备 …

OpenCV-Python:计算机视觉框架

目录 1.背景 2.早期计算机视觉框架 3.当前主流框架 4.计算机视觉框架的未来趋势 5.知识笔记 1.背景 俗话说“工欲善其事必先利其器”&#xff0c;想要学好计算机视觉&#xff0c;需要借助于相关的计算机视觉库&#xff0c;这样在进行学习的时候可以达到事半功倍的效果。 …

使用python的opencv实现人脸识别

简介&#xff1a;本项目主要使用python语言&#xff0c;主要的模块库有os&#xff0c;opencv-python&#xff0c;opencv-contrib-python。项目主要分为三个部分&#xff0c;人脸录入&#xff0c;训练数据&#xff0c;实现人脸的识别。本博客包含源代码&#xff0c;以及各个功能…

MVC、MVP、MVVM模式的区别

前言&#xff1a;这三个表现层框架设计模式是依次进化而形成MVC—>MVP—>MVVM。在以前传统的开发模式当中即MVC模式&#xff0c;前端人员只负责Model&#xff08;数据库&#xff09;、 View&#xff08;视图&#xff09;和 Controller /Presenter/ViewModel&#xff08;控…

android开发市场被抢占,鸿蒙能入行吗?

根据最新的数据&#xff0c;华为Mate60系列在上市第二周就成功占据了国内手机市场的17%份额&#xff0c;排名第二。而机构预测&#xff0c;华为手机在第37周有望超过20%的市场份额&#xff0c;成为国内手机市场的冠军。 一开始&#xff0c;人们对HarmonyOSNEXT持保留态度&…