小白入门pytorch(二)----神经网络

本文为🔗[小白入门Pytorch]学习记录博客

文章目录

  • 前言
  • 一、神经网络的组成部分
    • 1.神经元
    • 2.神经网络层
    • 3.损失函数
    • 4.优化器
  • 二、Pytorch构建神经网络中的网络层
    • 全连接层
    • 2.卷积层
    • 3.池化层
    • 4.循环神经网络
    • 5.转置卷积层
    • 6.归一化层
    • 7.激活函数层
  • 三、数据加载与预处理
    • 1.数据加载
    • 2.数据预处理
  • 四、模型训练与验证
    • 1.模型训练
    • 2.模型验证
  • 总结


前言

本文主要记录深度学习中的神经网络学习内容,包括理论和代码

一、神经网络的组成部分

在小白入门pytorch(一)中学习了pytorch的基本操作,本篇文章主要是记录使用Pytorch搭建神经网络的基础代码。文章记录的
顺序是按照🔗[小白入门Pytorch]教案二进行的。

  • 神经网络的组成部分
    • 神经元
    • 神经网络层

1.神经元

了解一下神经网络的历史:神经生物学家Warren MeCulloch和数学家Walter Pitts于1943年提出了一种基于早期的神经元理论学说的人工神经网络模型,称为MP模型(McCulloch-Pitts模型)。该模型是一种具有生物神经元特征的人工神经网络模型,被认为是神经网络研究的开端。

MP模型的基本思想是将神经元视为一个二进制变量,二进制变量很好懂,要么是1,要么是0,1是神经元兴奋和0是神经元抑制,我们将多个神经元进行连接,进行一系列的矩阵运算,就可以实现复杂的计算功能即是神经网络。

神经元通常由以下几个部分组成:

  • 输入(Inputs):神经元接收来自其他神经元或外部环境的输入数据。
  • 权重(Weights):每个输入都与一个权重相关联,用于调整输入的重要性。
  • 激活函数:激活函数将加权输入映射到输出。常用的激活函数包括Sigmoid、ReLU和Tanh(这几个激活函数都是非线性的)等。
  • 偏置(Bias):偏置是一个可学习的参数,用于调整神经元输出的阈值。
import torchclass Neuron(torch.nn.Module):def __init__(self, input_size):# 继承PyTorch中nn.Module类并实现自定义神经元模型Neuronsuper(Neuron, self).__init__()# 定义权重参数,大小为input_sizeself.weights = torch.nn.Parameter(torch.randn(input_size))# 定义偏置参数,大小为1self.bias = torch.nn.Parameter(torch.randn(1))# 实现前向传播函数def forward(self, inputs):# 计算加权和,点乘输入和权重,然后加上偏置weighted_sum = torch.sum(inputs * self.weights) + self.bias# 应用sigmoid函数进行非线性变换,计算输出结果output = torch.sigmoid(weighted_sum)return output# 创建一个Neuron对象,输入大小为3
neuron = Neuron(3)# 输入层,大小为3的张量
inputs = torch.tensor([0.5, -0.3, 0.1])# 计算神经元的输出
output = neuron(inputs)# 打印输出结果
print(output)

输出结果:

tensor([0.3399], grad_fn=<SigmoidBackward0>)

上面这部分代码是定义了一个自定义的神经元模型 Neuron,并计算了神经元的输出,使用Pytorch搭建。
首先,先定义一个定义了一个名为 Neuron 的类,它继承自 torch.nn.Module。该类表示一个神经元模型,并具有两个属性:权重参数 weights 和偏置参数 bias。这些参数在初始化时根据输入大小进行随机初始化。
然后,在 forward 方法中,计算加权和(权重与输入的点乘之和),并添加了偏置。
接下来,应用 sigmoid 激活函数将加权和转化为非线性输出。
最后,输出结果。

2.神经网络层

神经网络是一种有多个神经元以一定的方式联结形成的网络结构,是一种仿照生物神经网络结构和功能的人工智能技术。
说白了,神经网络中的计算过程就是矩阵运算,当然我这里指的是前线传播的过程。反向传播就是求导。
神经网络的组成: 输入层、多个隐藏层、输出层

以下是一些常见的神经网络层类型:

  • 全连接层(Fully Connected Layer):每个神经元都与前一层的所有神经元相连接。
  • 卷积层(Convolutional Layer):应用卷积操作来提取输入数据中的空间特征。
  • 池化层(Pooling Layer):通过减少特征图的大小来降低计算量,并保留重要的特征。
  • 循环层(Recurrent Layer):通过在神经网络中引入时间维度来处理序列数据。

下面是一个包含两个全连接层的神经网络示例代码:

import torch# 定义神经网络类,继承torch.nn.Module
class NeuralNetwork(torch.nn.Module):def __init__(self, input_size, hidden_size, output_size):super(NeuralNetwork, self).__init__()# 定义第一个全连接层,输入大小为input_size,输出大小为hidden_sizeself.fc1 = torch.nn.Linear(input_size, hidden_size)# 定义第二个全连接层,输入大小hidden_size,输出大小为output_sizeself.fc2 = torch.nn.Linear(hidden_size, output_size)def forward(self, inputs):# 计算第一个全连接层的输出结果,并使用ReLU激活函数处理hidden = torch.relu(self.fc1(inputs))# 计算第二个全连接层的输出结果,并使用Sigmoid激活函数处理output = torch.sigmoid(self.fc2(hidden))return output# 创建神经网络实例,输入大小为2,隐藏层大小为3,输出大小为1
net = NeuralNetwork(2, 3, 1)# 准备输入数据,包含2个数值
inputs = torch.tensor([0.5, -0.3])# 对于输入数据,计算神经网络的输出结果
output = net(inputs)# 打印输出结果
print(output)

输出结果:

tensor([0.5437], grad_fn=<SigmoidBackward0>)
  • 首先,定义了一个名为 NeuralNetwork 的类,它继承自
    torch.nn.Module。该类表示一个具有两个全连接层的神经网络,其中输入大小为 input_size,隐藏层大小为 hidden_size,输出大小为 output_size
  • 在初始化方法中,创建了两个全连接层,并分别将它们存储在类属性 fc1fc2 中。第一个全连接层将输入数据投影到隐藏层空间,其权重矩阵大小为 (hidden_size, input_size),偏置向量大小为 (hidden_size)。 第二个全连接层将隐藏层空间投影到输出空间,其权重矩阵大小为 (output_size,hidden_size),偏置向量大小为 (output_size)。
  • 在前向传播方法 forward 中,首先对输入数据执行第一个全连接层的计算,并使用 ReLU激活函数处理其输出结果。然后,我们对第二个全连接层的输出结果进行计算,并使用 Sigmoid激活函数处理其输出结果。最后,我们返回其输出结果。 创建了一个实例 net,其输入大小为2,隐藏层大小为3,输出大小为1。这意味着当我们将大小为2的输入数据输入模型时,模型将计算一个由1个数值组成的输出。准备了一个大小为2的输入向量inputs,并将其传递给网络模型,得到网络的输出结果。具体而言,我们调用 net(inputs)执行前向传播计算,并将其输出结果存储在变量 output 中。

3.损失函数

神经网络的目标是最小化预测输出与真实标签之间的差异。损失函数衡量了这种差异,并提供一个可优化的目标。常见的损失函数包括**均方误差(Mean Squared Error)、交叉熵损失(Cross-Entropy Loss)、对数损失(Log Loss)**等。

  • 均方误差(Mean Squared Error,MSE):计算预测值与目标值之间的平方差的平均值。torch.nn.MSELoss()
  • 交叉熵损失(Cross-Entropy Loss):在分类问题中,计算预测概率分布与真实标签之间的交叉熵。 torch.nn.CrossEntropyLoss()
  • 对数损失(Log Loss)损失函数:对数损失也是一个常见的分类损失函数,它通常用于处理二分类问题。它基于交叉熵损失函数,但对模型输出的概率应用了对数函数。torch.nn.BCELoss()

以下是一个使用均方误差作为损失函数的示例:

import torch# 创建预测值张量
predictions = torch.tensor([0.99999, 0.2222, 0.11111])# 创建标签值张量
labels = torch.tensor([1.0, 1.0, 0.0])# 实例化均方根误差(MSE)损失函数对象
loss_function = torch.nn.MSELoss()# 使用损失函数计算预测值和标签值之间的均方根误差
loss = loss_function(predictions, labels)# 打印均方根误差
print(loss)

输出结果:

tensor(0.2058)

4.优化器

  • 优化器用于更新神经网络参数以最小化损失函数。它使用梯度下降算法来调整参数的值。常用的优化器包括随机梯度下降(Stochastic Gradient Descent, SGD)、Adam
import torch# 创建一个神经网络和损失函数
net = NeuralNetwork(2, 3, 1)  # 创建一个具有2个输入特征、3个隐藏层单元和1个输出的神经网络模型
loss_function = torch.nn.MSELoss()  # 均方根误差(MSE)损失函数# 创建一个优化器
optimizer = torch.optim.Adam(net.parameters(), lr=0.01)  # Adam优化器,用于参数更新,学习率为0.01# 输入数据和真实标签
inputs = torch.tensor([0.1, -0.3])  # 输入数据张量,包含两个特征
labels = torch.tensor([1.0])  # 真实标签张量# 前向传播
output = net(inputs)  # 将输入数据传递给神经网络模型进行前向传播得到预测值
loss = loss_function(output, labels)  # 使用损失函数计算预测值和真实标签之间的均方根误差# 反向传播和参数更新
optimizer.zero_grad()  # 清零之前的梯度,避免梯度累积
loss.backward()  # 执行反向传播,计算梯度
optimizer.step()  # 根据梯度更新网络参数print(loss)  # 打印损失值

输出结果:

tensor(0.2413, grad_fn=<MseLossBackward0>)

二、Pytorch构建神经网络中的网络层

  • 在pytorch中,神经网络层(layers)是神经网络的基本组成部分,用于对输入数据进行转换和提取特征。Pytorch提供了丰富的层类型和功能,使得构建和训练深度学习模型变得更加便捷和灵活。

神经网络中包括哪些层呢?
1.全连接层(Fully connected Layer)
2.卷积层(Convolutional Layer)
3.池化层(Pooling Layer)
4.循环神经网络层(Recurrent Neural Network Layer)
5.转置卷积层(Transpose Convolutional Layer)
6.归一化层(Normalization Layer)
7.激活函数层(Activation Function Layer)
8.损失函数层(Loss Function Layer)
9.优化器层(optimizer Layer)

全连接层

  • 全连接层,也被称为线性层或密集层,是最简单的神经网络之一。它将输入的每个元素与权重相乘,并加上偏置项,然后通过激活函数进行非线性变换。全连接层的输出形状由其输入形状和输出维度确定。
import torch 
import torch.nn as nn# 导入PyTorch库# 定义输入和输出维度
input_size = 784  # 输入特征的数量784
output_size = 10  # 输出特征的数量,表示10个不同的类别# 创建全连接层
fc_layer = nn.Linear(input_size, output_size)  # 创建一个全连接层对象,输入特征数量为784,输出特征数量为10# 打印全连接层的权重和偏置项
print("权重:", fc_layer.weight)  # 打印全连接层的权重,形状为(10, 784)
print("偏置项:", fc_layer.bias)  # 打印全连接层的偏置项,形状为(10,)
权重: Parameter containing:
tensor([[ 2.5574e-02, -5.3259e-03, -4.4039e-03,  ...,  4.0028e-05,8.8669e-03, -1.5488e-02],[ 9.5699e-04,  1.1061e-03,  1.3532e-02,  ...,  2.4001e-02,3.0188e-03, -1.9964e-02],[-2.4929e-02, -6.6258e-05, -3.1090e-02,  ...,  2.0909e-02,2.9723e-02, -1.2300e-02],...,[-3.3147e-02, -2.1986e-02,  1.3504e-02,  ...,  1.5667e-02,2.0060e-02,  1.2932e-02],[ 5.0174e-03,  2.7909e-02, -3.5111e-02,  ...,  2.7326e-02,3.1136e-02, -2.1508e-02],[ 3.4995e-02, -2.9416e-02,  8.9518e-03,  ...,  2.4333e-02,2.5510e-02,  3.4048e-02]], requires_grad=True)
偏置项: Parameter containing:
tensor([ 0.0235, -0.0071, -0.0277,  0.0201,  0.0285, -0.0066,  0.0244, -0.0015,-0.0274, -0.0254], requires_grad=True)

2.卷积层

  • 卷积层是卷积神经网络中的核心层之一,用于从输入数据中提取空间特征。卷积层通过滑动窗口(卷积核)在输入上进行局部感知,并输出对应的特征图。Pytorch中的卷积层包括二维卷积层和三维卷积层,分别用于处理二维数据和三维数据。
import torch
import torch.nn as nn# 定义输入通道数、输出通道数和卷积核大小
in_channels = 3  # 输入图像的通道数,比如RGB图像的通道数为3
out_channels = 10  # 输出特征图的通道数,决定了卷积层的深度
kernel_size = 3  # 卷积核的大小,可以是一个整数或者一个元组(高度,宽度)# 创建二维卷积层
conv_layer = nn.Conv2d(in_channels, out_channels, kernel_size)  # 创建一个二维卷积层对象,指定输入通道数、输出通道数和卷积核大小# 打印二维卷积层的权重和偏置项
print("权重:", conv_layer.weight)  # 打印卷积层的权重,形状为(10, 3, 3, 3),表示10个输出通道,每个通道对应一个3x3的卷积核,输入通道数为3
print("偏置项:", conv_layer.bias)  # 打印卷积层的偏置项,形状为(10,),表示10个输出通道各自的偏置项
权重: Parameter containing:
tensor([[[[-0.1345, -0.1756, -0.1378],[-0.1873,  0.0453,  0.1870],[-0.0587, -0.1824,  0.0206]],[[-0.0236,  0.0837, -0.1119],[ 0.1802, -0.0412,  0.0246],[ 0.0555, -0.1600, -0.1051]],[[ 0.0305, -0.1235,  0.1504],[ 0.1417, -0.1083, -0.1260],[ 0.1019,  0.0467, -0.0930]]],[[[ 0.0049,  0.1599, -0.0155],[ 0.1395,  0.1167,  0.0457],[ 0.1842,  0.1533,  0.1551]],[[ 0.0357, -0.0851,  0.0223],[-0.1629,  0.1369,  0.0167],[ 0.1904,  0.0222, -0.1388]],[[-0.0846, -0.1352, -0.0039],[ 0.0290,  0.1842, -0.1837],[ 0.0431,  0.1595, -0.0067]]],[[[-0.1126, -0.0355, -0.1463],[ 0.0333,  0.0095,  0.0695],[-0.0106, -0.0312, -0.1256]],[[ 0.1589,  0.0826,  0.0012],[-0.1898,  0.0701,  0.1293],[ 0.1104,  0.1357, -0.0181]],[[-0.0141,  0.0343,  0.1184],[ 0.0223,  0.1064,  0.1161],[-0.1302, -0.0461,  0.1534]]],[[[-0.1347,  0.0752, -0.0799],[ 0.1490,  0.1549,  0.1169],[ 0.0238, -0.0565,  0.1537]],[[-0.0109,  0.1576, -0.1237],[-0.1440, -0.0062,  0.1227],[ 0.1083,  0.0711, -0.1654]],[[ 0.1691, -0.0773, -0.1273],[ 0.0252,  0.0923,  0.1173],[ 0.1610,  0.1237,  0.0340]]],[[[ 0.0421, -0.0296, -0.0942],[ 0.1319, -0.0052,  0.1092],[ 0.0359,  0.1117, -0.1803]],[[ 0.1128,  0.0074,  0.1556],[-0.1156, -0.1290, -0.0532],[-0.1897, -0.0241,  0.0173]],[[ 0.1492,  0.0639,  0.0156],[-0.1848,  0.0436,  0.1843],[ 0.1261, -0.1529, -0.0433]]],[[[-0.0377, -0.1315,  0.1441],[ 0.1290,  0.1604,  0.1032],[-0.1481, -0.0640, -0.1081]],[[-0.0525,  0.1381, -0.0980],[-0.0356, -0.1787,  0.0579],[ 0.0794, -0.0317,  0.1197]],[[ 0.0696, -0.1164, -0.1332],[-0.0522,  0.1866, -0.1177],[ 0.0478, -0.1263, -0.0446]]],[[[-0.0707,  0.0787,  0.0932],[-0.0645, -0.0981,  0.1409],[ 0.0830, -0.0724,  0.0160]],[[-0.0663, -0.1531,  0.0385],[-0.0376, -0.0028,  0.0165],[ 0.1408,  0.0061, -0.0085]],[[ 0.1485, -0.0885, -0.0300],[ 0.0784,  0.1103, -0.1027],[-0.1513, -0.1135,  0.1773]]],[[[ 0.1529,  0.0545,  0.0845],[-0.0492,  0.0263,  0.0706],[ 0.1417, -0.0234,  0.1385]],[[-0.1917, -0.1262, -0.1102],[ 0.0726,  0.1231,  0.0764],[-0.0670,  0.0726,  0.0026]],[[ 0.0701, -0.1172, -0.0528],[-0.0076, -0.0333, -0.0411],[-0.0275, -0.0982,  0.0640]]],[[[-0.1637,  0.1234,  0.1289],[-0.0831, -0.0061,  0.0587],[-0.0125, -0.1588, -0.0585]],[[ 0.1838,  0.1203, -0.1888],[-0.1113, -0.0859,  0.1053],[ 0.0857, -0.1597,  0.0186]],[[ 0.1576, -0.1528,  0.1484],[ 0.0019,  0.0216, -0.0182],[-0.1688, -0.1134,  0.1220]]],[[[ 0.1687, -0.0447, -0.0339],[-0.1022, -0.1690,  0.0198],[-0.1686, -0.1009, -0.0762]],[[ 0.0394,  0.0816,  0.0880],[ 0.0414, -0.0767,  0.1095],[ 0.1279, -0.0704, -0.0042]],[[-0.1413,  0.0231, -0.1731],[-0.1102,  0.1115,  0.1701],[-0.0567, -0.1341,  0.0511]]]], requires_grad=True)
偏置项: Parameter containing:
tensor([ 0.0481, -0.1906, -0.1884,  0.0912, -0.0207,  0.1297, -0.1344,  0.0010,-0.1730, -0.1730], requires_grad=True)

3.池化层

  • 池化层用于减小特征图的空间维度,降低模型的参数数量,并增强模型的平移不变性。最大池化是最常用的池化方式,它们分别选择局部区域中的最大值和平均值作为输出。
import torch
import torch.nn as nn# 导入PyTorch库# 定义池化层区域大小和步幅
kernel_size = 2  # 池化区域的大小,可以是一个整数或者一个元组(高度,宽度)
stride = 2  # 步幅,控制池化操作移动的步长# 创建池化层
pool_layer = nn.MaxPool2d(kernel_size, stride)  # 创建一个最大池化层对象,指定池化区域的大小和步幅# 打印最大池化层的参数
print('池化区域大小:', pool_layer.kernel_size)  # 打印池化区域的大小,形状为(2, 2),表示高度和宽度均为2的池化区域
print('步幅:', pool_layer.stride)  # 打印步幅,形状为(2, 2),表示在高度和宽度方向上的步幅均为2
池化区域大小: 2
步幅: 2

4.循环神经网络

  • 循环神经网络(Recurrent Neural NetWork, RNN)层用于处理序列数据,具有记忆力和上下文感知能力。RNN层通过在时间步之间共享权重,实现对序列的逐步处理,并输出相应的隐藏状态。
import torch
import torch.nn as nn # 定义输入特征维度、隐藏状态维度和层数
input_size = 10  # 输入特征的维度,也就是每个时间步的输入数据的大小
hidden_size = 20  # 隐藏状态的维度,决定了RNN层的输出大小
num_layers = 2  # RNN层的层数,决定了RNN的深度# 创建RNN层
rnn_layer = nn.RNN(input_size, hidden_size, num_layers)  # 创建一个RNN层对象,指定输入特征维度、隐藏状态维度和层数# 打印RNN层的参数
print('输入特征维度:', rnn_layer.input_size)  # 打印输入特征维度,即为10
print('隐藏状态维度:', rnn_layer.hidden_size)  # 打印隐藏状态维度,即为20
print('层数:', rnn_layer.num_layers)  # 打印层数,即为2
输入特征维度: 10
隐藏状态维度: 20
层数: 2

5.转置卷积层

  • 转置卷积层,也被称为反卷积层,用于实现上采样操作,将低纬特征图转换为高维特征图。转置卷积层通过反向卷积操作将输入特征图映射到更大的输出特征图。
import torch
import torch.nn as nn# 定义输入通道数、输出通道数和卷积大小
in_channels = 3  # 输入的通道数,即输入特征图的深度
out_channels = 16  # 输出的通道数,即卷积核的个数
kernel_size = 3  # 卷积核的大小,可以是一个整数或者一个元组(高度,宽度)# 创建转置卷积层
transconv_layer = nn.ConvTranspose2d(in_channels, out_channels, kernel_size)  # 创建一个转置卷积层对象,指定输入通道数、输出通道数和卷积大小# 打印转置卷积的权重和偏置项
print("权重:", transconv_layer.weight)  # 打印转置卷积的权重,形状为(16, 3, 3, 3),表示有16个卷积核,每个卷积核的形状为(3, 3, 3)
print("偏置项:", transconv_layer.bias)  # 打印转置卷积的偏置项,形状为(16,),表示有16个偏置项,每个偏置项对应一个卷积核

6.归一化层

  • 归一化层用于调整神经网络的激活值分布,提升模型的收敛速度和泛化能力。常用的归一化层包括归一化和层归一化
import torch
import torch.nn as nn# 定义特征维度
num_features = 16  # 特征的维度,即特征的深度# 创建批归一化层
bn_layer = nn.BatchNorm2d(num_features)  # 创建一个批归一化层对象,指定特征维度# 打印批归一化层的参数
print('特征维度:', bn_layer.num_features)  # 打印特征维度,即为16
print("均值:", bn_layer.running_mean)  # 打印批归一化层的均值,初始化为全零
print('方差:', bn_layer.running_var)  # 打印批归一化层的方差,初始化为全零
特征维度: 16
均值: tensor([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
方差: tensor([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])

7.激活函数层

  • 激活函数层用于引入非线性变换,增加神经网络的表达能力。常用的激活函数包括ReLU/sigmoid/Tanh等
import torch
import torch.nn as nn# 创建激活函数层(Relu)
activation_layer = nn.ReLU()# 定义输入张量
input_tensor = torch.randn(10)# 对输入张量进行激活函数变换
output_tensor = activation_layer(input_tensor)# 打印输出张量
print('输出张量:', output_tensor)
输出张量: tensor([0.0000, 0.0000, 1.6909, 0.0000, 0.0000, 0.0000, 0.0000, 0.9084, 0.0000,0.0000])

三、数据加载与预处理

  • 在深度学习任务中,数据的加载和预处理是非常重要的步骤。Pytorch提供了强大的数据加载和预处理工具,使得我们能够高效地处理各种类型的数据。

1.数据加载

  • Pytorch中的数据加载主要通过torch.utils.data模块实现。该模块提供了DatasetDataLoader两个核心类,分别用于定义数据集和数据加载器
  • Dataset类是一个抽象类,用于表示数据集。我们可以继承该类并实现自定义的数据集。在自定义数据集中,我们需要实现两个方法:len__和__getitem. __len__返回数据集的样本数量,__getitem__方法根据索引返回单个样本
import torch
from torch.utils import data
from torch.utils.data import Datasetclass MyDataset(data.Dataset):def __init__(self, data_list):# 初始化数据集self.data_list = data_listdef __len__(self):# 返回数据集大小return len(self.data_list)def __getitem__(self, index):# 根据索引索取样本sample = self.data_list[index]return sample

在上述示例中,MyDataset类接受一个数据列表作为输入,并实现了__len__和__getitem__方法

  • torch.utils.data.DataLoader是Pytorch中一个重要的类,用于高效加载数据集。它可以处理数据的批次化、打乱顺序、多线程数据加载等功能。
import torch.utils.data as data
# 创建MyDataset实例my_dataset,它包含了一个整数列表。
my_dataset = MyDataset([1, 2, 3, 4, 5, 6, 7, 8, 9])
# 使用DataLoader类创建一个数据加载器my_dataloader,它将my_dataset作为输入,并将数据分成大小为4的批次,并对数据进行打乱随机化。
my_dataloader = data.DataLoader(my_dataset,batch_size=4,shuffle=True)
# 遍历my_dataloader,打印每个批次的数据
for batch in my_dataloader:print(batch)
tensor([4, 2, 5, 8])
tensor([1, 3, 9, 6])
tensor([7])
  • torch.utils.data.Datasettorch.utils.data.DataLoader用于加载数据集、用于对数据进行批量处理和随机化。

2.数据预处理

  • 数据预处理是在将数据输入模型之前对数据进行的一系列操作,以提高模型的性能和准确性。Pytorch提供了多种数据预处理方法,包括常见的数据变换、标准化、图像增强等。以下是一些常见的数据预处理方法:
  • Tensor转换:将数据转换为torch.Tensor类型是数据预处理的第一步。torch.Tensor是Pytorch中表示张量的主要数据类型
  • 数据变换:将数据转换为torch.Tensor类型是数据预处理的第一步。torch.Tensor是Pytorch中表示张量的主要数据类型
  • 数据标准化:数据标准化是对数据进行平均值和标准差的缩放,以使得数据具有零均值和单位方差。这通常用于提高模型的收敛性和稳定性
  • 图像增强:图像增强是对图像进行变换或添加噪声,以增加训练数据的多样性和鲁棒性。Pytorch提供了torchvision.transforms模块中多种图像增强方法,如随机裁剪、翻转、旋转等。

四、模型训练与验证

1.模型训练

Pytorch中模型训练主要包括以下几个步骤

  • 1.准备数据:首先,准备好训练数据和对应的标签。可以使用torch.utils.data模块中的Dataset和DataLoader类来加载和批量处理数据
  • 2.定义模型:接下来,定义模型的结构。可以选择torch.nn模块中的各种层和模型来构建自己的神经网络模型
  • 3.定义损失函数:为了训练模型,定义损失函数来度量模型预测结果与真实标签之间的差异。可以使用torch.nn模块中的各种损失函数,如均方根误差(MSE)、交叉熵损失等。
  • 4.定义优化器:为了更新模型的参数,需要选择一个优化器来优化模型的损失函数。可以使用torch.optim模块中的各种优化器,如随机梯度(SGD)、Adam等
  • 5.训练模型:在每个训练迭代中,需要执行以下步骤:
    • 前向传播:将输入数据通过模型得到模型的输出结果
    • 计算损失:将模型的输出结果与真实标签计算损失函数的值
    • 反向传播:根据损失函数的梯度,计算模型参数的梯度
    • 参数更新:使用优化器根据梯度信息更新模型的参数

掌握这几个步骤,你就知道怎么进行模型训练了

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoadertrain_data = np.arange(512)
# 准备数据
train_dataset = MyDataset(train_data)
train_dataloader = DataLoader(train_dataset, batch_size=64, shuffle=True)# 定义模型
model = MyModel() # 注:这里的MyModel()需要自己去写一个模型,我这里没有写# 定义损失函数
loss_fn = nn.CrossEntropyLoss()# 定义优化器
optimizer = optim.SGD(model.parameters(), lr=0.01)# 训练模型
for epoch in range(num_epochs):for batch in train_dataloader:inputs, labels = batch# 前向传播outputs = model(inputs)# 计算损失loss = loss_fn(outputs, labels)# 反向传播optimizer.zero_grad() # 梯度清零loss.backward()# 参数更新optimizer.step()

2.模型验证

# 准备验证数据
val_dataset = MyDataset(val_data)
val_dataloader = DataLoader(val_dataset, batch_size=64)# 模型验证
model.eval() # 设置模型为评估模式
with torch.no_grad(): # 禁止梯度计算for batch in val_dataloader:inputs, labels = batch#前向传播outputs = model(inputs)

总结

以上介绍了深度学习中的神经网络,以及搭建神经网络所需要的步骤。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构之双链表

双链表 1.复杂方法的图分析2.My_LinkedList代码3.接口MY_lIST4.测试类 1.复杂方法的图分析 2.My_LinkedList代码 package My_liNKEDlIST;public class My_LinkedList implements MY_lIST{static class ListNode{public int val;public ListNode prev;public ListNode next;pub…

git 分支管理进阶

目录 1. merge 命令&#xff1a;git merge A 2. rebase 命令&#xff1a;git rebase A 命令&#xff1a;git rebase B A 3. 指针——分支切换 3.1哈希值方式 3.2相对引用 3.3综合练习 4.撤销 4.1 本地分支 reset 4.2 远程分支 revert 5.Cherry-pick与交互式的 …

十天学完基础数据结构-第三天(数组(Array))

数组的基本概念 数组是一种线性数据结构&#xff0c;用于存储相同数据类型的元素。它具有以下基本概念&#xff1a; 元素&#xff1a;数组中的每个数据项称为元素&#xff0c;可以是整数、浮点数、字符等。 索引&#xff1a;每个元素在数组中都有一个唯一的位置&#xff0c;称…

Linux--socket编程

socket套接字编程 一、服务器和客户端的开发步骤&#xff1a; 1、创建套接字 2、为套接字添加信息&#xff08;ip地址和端口号&#xff09; 3、监听网络连接 4、监听到有客户端接入&#xff0c;接受连接&#xff08;如没有接入&#xff0c;会发生阻塞到&#xff09; 5、数据…

flink处理函数--副输出功能

背景 在flink中&#xff0c;如果你想要访问记录的处理时间或者事件时间&#xff0c;注册定时器&#xff0c;或者是将记录输出到多个输出流中&#xff0c;你都需要处理函数的帮助&#xff0c;本文就来通过一个例子来讲解下副输出 副输出 本文还是基于streaming-with-flink这本…

概率密度函数,概率分布函数

概率密度函数&#xff1a;描述信号的取值在某个确定的取值点附近的概率的函数&#xff1b;概率分布函数的导数。 以幅值大小为横坐标&#xff0c;以每个幅值间隔内出现的概率为纵坐标进行统计分析。反映了信号落在不同幅值强度区域内的概率情况。 直方图&#xff1a;对每个幅…

数据结构--队列与循环队列的实现

数据结构–队列的实现 1.队列的定义 比如有一个人叫做张三,这天他要去医院看病,看病时就需要先挂号,由于他来的比较晚,所以他的号码就比较大,来的比较早的号码就比较小,需要到就诊窗口从小号到大依次排队,前面的小号就诊结束之后,才会轮到大号来,小号每就诊完毕就销毁,每新来…

基于Java的火车高铁订票购票系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

支持向量机SVM:从数学原理到实际应用

目录 一、引言背景SVM算法的重要性 二、SVM基础线性分类器简介什么是支持向量&#xff1f;超平面和决策边界SVM的目标函数 三、数学背景和优化拉格朗日乘子法&#xff08;Lagrange Multipliers&#xff09;KKT条件核技巧&#xff08;Kernel Trick&#xff09;双重问题和主问题&…

【云备份】

文章目录 [toc] 1 :peach:云备份的认识:peach:1.1 :apple:功能了解:apple:1.2 :apple:实现目标:apple:1.3 :apple:服务端程序负责功能:apple:1.4 :apple:服务端功能模块划分:apple:1.5 :apple:客户端程序负责功能:apple:1.6 :apple:客户端功能模块划分:apple: 2 :peach:环境搭建…

留住时光、固化时间、让一瞬成为永恒——全新的真人手办定制模式,就选易模小程序制作。

如何能永远留住一瞬间&#xff1f; 有人说我可以拍摄一张照片&#xff0c;照片的问世确实给生活中许多美好的瞬间留下了可以记录的工具。但是随着时间的流逝&#xff0c;照片终究也会泛黄&#xff0c;似乎有一些记忆的温度&#xff0c;有一些岁月的棱角&#xff0c;也是照片所给…

SD卡格式化怎么恢复?

随着智能手机、平板电脑、数码相机和行车记录仪等各种移动电子设备走入千家万户&#xff0c;SD卡作为与这些设备相配套的存储介质&#xff0c;也随之获得了广泛的市场认可。SD卡因其体积小巧、容量庞大、读写速度高及与多种设备兼容的优点&#xff0c;逐渐成为日常工作和生活中…

怒刷LeetCode的第23天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;贪心算法 方法二&#xff1a;动态规划 方法三&#xff1a;回溯算法 方法四&#xff1a;并查集 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;排序和遍历 方法二&#xff1a;扫描线算法 方法…

StarRocks数据导入

1、相关环境 Flink作为当前流行的流式计算框架&#xff0c;在对接StarRocks时&#xff0c;若直接使用JDBC的方式"流式"写入数据&#xff0c;对StarRocks是不友好的&#xff0c;StarRocks作为一款MVCC的数据库&#xff0c;其导入的核心思想还是"攒微批降频率&qu…

HTTP协议,请求响应

、概述 二、HTTP请求协议 三、HTTP响应协议 四、请求数据 1.简单实体参数 RequestMapping("/simpleParam")public String simpleParam(RequestParam(name "name" ,required false ) String username, Integer age){System.out.println (username "…

车牌文本检测与识别:License Plate Recognition Based On Multi-Angle View Model

论文作者&#xff1a;Dat Tran-Anh,Khanh Linh Tran,Hoai-Nam Vu 作者单位&#xff1a;Thuyloi University;Posts and Telecommunications Institute of Technology 论文链接&#xff1a;http://arxiv.org/abs/2309.12972v1 内容简介&#xff1a; 1&#xff09;方向&#x…

可以动态改变刻度背景色的车速仪表盘

最近做的项目的主页面需要用到一个仪表盘来动态显示车速&#xff0c;同时改变对应的背景色 仪表盘 开始是想着使用echarts&#xff0c;修修改改拿来用&#xff0c;但是人家客户有规定&#xff0c;必须搞个差不多的&#xff0c;那没办法&#xff0c;自 己动手搞个吧 截图如下&am…

多源最短路径的原理及C++实现

时间复杂度 O(n3),n是端点数。 核心代码 template<class T, T INF 1000 * 1000 * 1000> class CNeiBoMat { public: CNeiBoMat(int n, const vector<vector<int>>& edges,bool bDirectfalse,bool b1Base false) { m_vMat.assign(n, vector<…

2023年【R2移动式压力容器充装】模拟考试及R2移动式压力容器充装模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 R2移动式压力容器充装模拟考试考前必练&#xff01;安全生产模拟考试一点通每个月更新R2移动式压力容器充装模拟考试题题目及答案&#xff01;多做几遍&#xff0c;其实通过R2移动式压力容器充装操作证考试很简单。 1…