上一节讲了卷积计算的原理以及如何进行卷积运算的代码实现,这节我们讲一下如何知道输入张量和输出张量来得到卷积核张量。在卷积神经网络中,卷积核张量的确定是一个关键步骤,它直接影响到网络的性能和特征提取的能力。根据输入张量和输出张量来确定卷积核张量,主要涉及到对输入张量和输出张量的维度、卷积核参数的理解和计算。通过调整这些参数,我们可以控制卷积操作后图像的尺寸和特征提取的效果。在实际应用中,我们需要根据具体的任务需求和数据特点来选择合适的参数。
# 这是一个可以知道输入张量和输出张量而计算出近似卷积核的程序
import torch
import torch.nn as nn # 这是PyTorch库中的一个模块,包含了许多用于构建神经网络的层和函数
# 定义输入与输出
#X = torch.randn_like(torch.randint(0, 10, (6, 6)), dtype=torch.float)
#Y = torch.randn_like(torch.randint(0, 10, (4, 4)), dtype=torch.float)
X = torch.rand(6,6)
Y = torch.rand(4,4)
#print(X)
# 训练卷积层
# 构造一个二维卷积层,单通道(一个颜色通道)(3,3)
conv2d = nn.Conv2d(1,1, kernel_size=(3, 3), bias=False)
X = X.reshape((1, 1, 6, 6)) # X现在是一个高维的张量,具有批量大小为1、通道数为1、高度为6和宽度为6
Y = Y.reshape((1, 1, 4, 4))
# print(X)
# 定义学习率
lr = 0.001
# 定义损失函数
# MSELoss():这是一个定义在torch.nn 模块中的函数,代
# 表均方误差损失函数(Mean Squared Error Loss)。这个损失函数常用于回归问题中,计算的是预测值和真实值之间的均方误差。
loss_fn = torch.nn.MSELoss()
for i in range(400):
Y_pre = conv2d(X)
loss = loss_fn(Y_pre, Y)
conv2d.zero_grad() # 重置梯度,使得梯度从0开始,避免梯度累加,保证独立性
loss.backward() # 在模型中执行 反向传播
# 迭代卷积核
conv2d.weight.data[:] -= lr * conv2d.weight.grad
if (i + 1) % 100 == 0:
print(f'epoch {i + 1}, loss {loss.sum():.4f}')
# 查看卷积核
print(conv2d.weight.data.reshape((3,3)))
迭代训练的过程
迭代训练(Iterative Training)是指通过多次重复训练过程来优化模型参数,以最小化损失函数。在这个过程中,模型会根据损失函数的反馈不断调整其参数,以期达到更好的预测效果。
初始化
- 模型初始化:首先,需要初始化模型的参数。这些参数通常是随机初始化的,但也可以根据特定策略进行初始化。
- 优化器选择:选择一个优化算法(如SGD、Adam等)来更新模型参数。优化器的作用是根据损失函数的梯度来调整参数,以最小化损失。
前向传播
在每次迭代中,首先进行前向传播(Forward Propagation),即输入数据通过模型生成预测值。
计算损失
使用MSELoss计算预测值与实际值之间的差异,得到损失值。
反向传播
通过反向传播(Backward Propagation)计算损失函数对模型参数的梯度。这一步骤是基于链式法则,逐层计算每一层参数的梯度。
参数更新
优化器根据计算得到的梯度更新模型参数。这个过程会重复进行,直到达到预设的迭代次数或损失值满足某个条件。
400次迭代的作用
进行400次迭代意味着模型会经历400次前向传播、损失计算、反向传播和参数更新的循环。这个过程的目的是让模型逐渐学习到数据中的模式,从而提高预测的准确性。随着迭代的进行,模型的损失值应该逐渐减小,表示模型在不断改进。
总结
使用MSELoss作为损失函数并进行400次迭代训练的整个过程,是一个通过不断调整模型参数以最小化预测误差的过程。这个过程包括初始化模型和优化器、前向传播生成预测、计算损失、反向传播计算梯度以及更新模型参数。通过多次迭代,模型能够逐渐学习到数据的内在规律,从而提高其预测性能。