使用PyTorch构建神经网络(详细步骤讲解+注释版) 02-数据读取与训练

简介: 熟悉基础数据分析的同学应该更习惯使用Pandas库对数据进行处理,此处为了加深对PyTorch的理解,我们尝试使用PyTorch读取数据。这里面用到的包是torch.utils.data.Dataset。在下面的代码中,分别定义了len方法与getitem方法。这两个方法都是python的内置方法,但是对类并不适用。这里通过重写方法使类也可以调用,并且自定义了getitem方法的输出

前面我们已经建立好了一个神经网络的分类器Class。

使用PyTorch构建神经网络(详细步骤讲解+注释版) 01-建立分类器类

下面进行数据的读取与模型训练

1 使用PyTorch对数据处理

熟悉基础数据分析的同学应该更习惯使用Pandas库对数据进行处理,此处为了加深对PyTorch的理解,我们尝试使用PyTorch读取数据。这里面用到的包是torch.utils.data.Dataset。

在下面的代码中,分别定义了len方法与getitem方法。这两个方法都是python的内置方法,但是对类并不适用。这里通过重写方法使类也可以调用,并且自定义了getitem方法的输出


from torch.utils.data import Dataset
class MnistDataset:
    def __init__(self, csv_file):
        self.data = pandas.read_csv(csv_file)
        pass
    def __len__(self):
        return len(self.data)
    def __getitem__(self, index):
        # 预期输出的张量制作
        label = self.data.iloc[index,0]
        target = torch.zeros(10)
        target[label] = 1.0
        # 图像数据标准化
        image_values = torch.FloatTensor(self.data.iloc[index, 1:].values)/255.0
        return label, image_values, target


len方法起到了返回DataFrame大小的作用。


label:获得了指定数据的第一个数值,也就是这个数据的标签;

target:制作了一个维度为10的张量,标签对应的项是1,其他是0。比如,某个手写数据的标签是2,则这个张量是[0, 0, 1, 0, 0, 0, 0, 0, 0, 0]。

image_values:像素输入的值是0-255,这里对像素数据做了标准化,是值位于0-1之间。

在MnistDataset类中,博主也看到有教程为其添加了绘画的功能,这个功能在实现神经网络的过程中,并不会起到实质性作用,但是可能有助于快速查看数据情况,所以我把代码放到这里,很简单大家自行学习就好。


class MnistDataset:
    def plot_image(self, index):
        arr = self.data.iloc[index, 1:].values.reshape(28, 28)
        plt.title("label=" + str(self.data.iloc[index, 0]))
        plt.imshow(arr, interpolation='none', cmap='Blues')
        plt.show()
1


可以使用这个功能查看数据集:


mnist_dataset = MnistDataset('数据集地址')
mnist_dataset.plot_image(123)
1

2

截至目前,MnistDataset这个类的全部代码为


class MnistDataset:
    def __init__(self, csv_file):
        self.data = pandas.read_csv(csv_file)
        pass
    def __len__(self):
        return len(self.data)
    def __getitem__(self, index):
        # 预期输出的张量制作
        label = self.data.iloc[index, 0]
        target = torch.zeros(10)
        target[label] = 1.0
        # 图像数据标准化
        image_values = torch.FloatTensor(self.data.iloc[index, 1:].values) / 255.0
        return label, image_values, target
def plot_image(self, index):
        arr = self.data.iloc[index, 1:].values.reshape(28, 28)
        plt.title("label=" + str(self.data.iloc[index, 0]))
        plt.imshow(arr, interpolation='none', cmap='Blues')
        plt.show()
        pass


这是目前我们所完成的内容(蓝色部分位于上一篇博客)


2beec639d07c4665bffdd071ed4591cb.png




2 模型训练

首先创建一个分类器类

C = Classifier()


在训练过程中,我们可以只训练一轮,也就是训练集中的数据依次传入模型进行训练,也可以训练多轮,即一个数据集都传入一遍之后,在从头重复传入数据进行训练的这个动作。对于描述训练几轮有一个专有名词epochs,在写代码时通常会以这个单词作为变量名。

接下来我们执行三组循环:


epochs = 3
for i in range(epochs):
    print('training epoch', i+1, 'of', epochs)
    for label, image_data_tensor, target_tensor in mnist_dataset:
        C.train(image_data_tensor, target_tensor)
1


在mnist_dataset能够直接取数是因为我们之前定义了getitem方法。以上就是完整的训练过程。在训练时,每当完成一轮或完成10000组数据都会有相应的print(后者来自train方法)。如果我们还想知道这一过程花费的时间,还可以导入time包进行计算。这一部分的完整代码如下。


start_time =time.perf_counter() # 计时开始
C = Classifier()
epochs = 3
for i in range(epochs):
    print('training epoch', i+1, 'of', epochs)
    for label, image_data_tensor, target_tensor in mnist_dataset:
        C.train(image_data_tensor, target_tensor)
end_time =time.perf_counter()
print('完成3个epochs需要的时间是', end_time-start_time)


f7a4789a5f294aa09616bf936f4f953f.png


一般情况下,使用个人电脑进行计算的话,每轮训练一般不超过10分钟。如果购买了Google Colab等付费在线服务器,这一过程还会更快。


3 训练过程可视化

在训练结束之后,如果希望查看训练次数与误差之间的关系,我们可以在Classifier类中定义一个可视化方法。首先在initial下,初始化一个用于记录损失的列表。


class Classifier(nn.Module):
    def __init__(self):
        # 用于展示训练进程的计数器和列表
        self.counter = 0
        self.progress = []


接着在train方法下,每隔10个训练记录一次损失值,每隔10000个输出一次训练个数(也就是对应上面console截图的输出)。


class Classifier(nn.Module):
    def train(self, inputs, targets):
        # 进程可视化数据
        self.counter += 1
        if self.counter % 10 == 0:
            self.progress.append(loss.item())
            pass
        if self.counter % 10000 == 0:
            print("counter = ", self.counter)
            pass



最后,建立一个绘图的方法,使用matplotlib.pyplot(import as plt)绘制散点图。


class Classifier(nn.Module):
    # 训练进程制图
    def plot_progress(self):
        df = pandas.DataFrame(self.progress, columns=['loss'])
        df.plot(ylim=(0, 1.0), figsize=(16, 8), alpha=0.1, marker='.', grid=True, yticks=(0, 0.25, 0.5))
        plt.show()


这里的一些设置主要是控制绘图细节,比如ylim是坐标轴范围,alpha是透明度,yticks是网格位置等。这一部分如有兴趣也可以对matplotlib.pyplot进行专门学习。

在完善了类的相关方法后,再次进行训练就会自动保存误差数据,训练之后,我们使用:


C.plot_progess()
1

就可以把图绘制出来了。

e9583d1d38f345c8862fdb8f2ca686c3.png





可以看出,随着训练次数的增加,损失下降还是比较明显的。


本系列文章使用不断迭代优化代码的方式进行撰写,以模块不断对代码进行补充方便大家理解。如果希望获取完整代码文件,直接文末留言或者到个人博客的资源区进行下载即可。完整代码下载链接

下一篇文章将会讲解如何评价模型表现与提升模型准确率


相关文章
|
4天前
|
机器学习/深度学习 算法 PyTorch
基于Pytorch Gemotric在昇腾上实现GraphSage图神经网络
本文详细介绍了如何在昇腾平台上使用PyTorch实现GraphSage算法,在CiteSeer数据集上进行图神经网络的分类训练。内容涵盖GraphSage的创新点、算法原理、网络架构及实战代码分析,通过采样和聚合方法高效处理大规模图数据。实验结果显示,模型在CiteSeer数据集上的分类准确率达到66.5%。
|
17天前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
42 3
|
1月前
|
安全 算法 网络安全
量子计算与网络安全:保护数据的新方法
量子计算的崛起为网络安全带来了新的挑战和机遇。本文介绍了量子计算的基本原理,重点探讨了量子加密技术,如量子密钥分发(QKD)和量子签名,这些技术利用量子物理的特性,提供更高的安全性和可扩展性。未来,量子加密将在金融、政府通信等领域发挥重要作用,但仍需克服量子硬件不稳定性和算法优化等挑战。
|
1月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
利用Python和TensorFlow构建简单神经网络进行图像分类
利用Python和TensorFlow构建简单神经网络进行图像分类
59 3
|
1月前
|
存储 安全 网络安全
云计算与网络安全:保护数据的新策略
【10月更文挑战第28天】随着云计算的广泛应用,网络安全问题日益突出。本文将深入探讨云计算环境下的网络安全挑战,并提出有效的安全策略和措施。我们将分析云服务中的安全风险,探讨如何通过技术和管理措施来提升信息安全水平,包括加密技术、访问控制、安全审计等。此外,文章还将分享一些实用的代码示例,帮助读者更好地理解和应用这些安全策略。
|
23天前
|
弹性计算 安全 容灾
阿里云DTS踩坑经验分享系列|使用VPC数据通道解决网络冲突问题
阿里云DTS作为数据世界高速传输通道的建造者,每周为您分享一个避坑技巧,助力数据之旅更加快捷、便利、安全。本文介绍如何使用VPC数据通道解决网络冲突问题。
77 0
|
1月前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:从漏洞到加密,保护数据的关键步骤
【10月更文挑战第24天】在数字化时代,网络安全和信息安全是维护个人隐私和企业资产的前线防线。本文将探讨网络安全中的常见漏洞、加密技术的重要性以及如何通过提高安全意识来防范潜在的网络威胁。我们将深入理解网络安全的基本概念,学习如何识别和应对安全威胁,并掌握保护信息不被非法访问的策略。无论你是IT专业人士还是日常互联网用户,这篇文章都将为你提供宝贵的知识和技能,帮助你在网络世界中更安全地航行。
|
2月前
|
存储 安全 网络安全
云计算与网络安全:如何保护您的数据
【10月更文挑战第21天】在这篇文章中,我们将探讨云计算和网络安全的关系。随着云计算的普及,网络安全问题日益突出。我们将介绍云服务的基本概念,以及如何通过网络安全措施来保护您的数据。最后,我们将提供一些代码示例,帮助您更好地理解这些概念。
|
6月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【从零开始学习深度学习】28.卷积神经网络之NiN模型介绍及其Pytorch实现【含完整代码】
【从零开始学习深度学习】28.卷积神经网络之NiN模型介绍及其Pytorch实现【含完整代码】
|
4月前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch代码实现神经网络
这段代码示例展示了如何在PyTorch中构建一个基础的卷积神经网络(CNN)。该网络包括两个卷积层,分别用于提取图像特征,每个卷积层后跟一个池化层以降低空间维度;之后是三个全连接层,用于分类输出。此结构适用于图像识别任务,并可根据具体应用调整参数与层数。
下一篇
DataWorks