使用torch库进行简单的卷积操作 (1)

上一节讲了卷积计算的原理以及如何进行卷积运算的代码实现,这节我们讲一下如何知道输入张量和输出张量来得到卷积核张量。在卷积神经网络中,卷积核张量的确定是一个关键步骤,它直接影响到网络的性能和特征提取的能力。根据输入张量和输出张量来确定卷积核张量,主要涉及到对输入张量和输出张量的维度、卷积核参数的理解和计算。通过调整这些参数,我们可以控制卷积操作后图像的尺寸和特征提取的效果。在实际应用中,我们需要根据具体的任务需求和数据特点来选择合适的参数。

# 这是一个可以知道输入张量和输出张量而计算出近似卷积核的程序
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)是指通过多次重复训练过程来优化模型参数,以最小化损失函数。在这个过程中,模型会根据损失函数的反馈不断调整其参数,以期达到更好的预测效果。

初始化
  1. 模型初始化:首先,需要初始化模型的参数。这些参数通常是随机初始化的,但也可以根据特定策略进行初始化。
  2. 优化器选择:选择一个优化算法(如SGD、Adam等)来更新模型参数。优化器的作用是根据损失函数的梯度来调整参数,以最小化损失。
前向传播

在每次迭代中,首先进行前向传播(Forward Propagation),即输入数据通过模型生成预测值。

计算损失

使用MSELoss计算预测值与实际值之间的差异,得到损失值。

反向传播

通过反向传播(Backward Propagation)计算损失函数对模型参数的梯度。这一步骤是基于链式法则,逐层计算每一层参数的梯度。

参数更新

优化器根据计算得到的梯度更新模型参数。这个过程会重复进行,直到达到预设的迭代次数或损失值满足某个条件。

400次迭代的作用

进行400次迭代意味着模型会经历400次前向传播、损失计算、反向传播和参数更新的循环。这个过程的目的是让模型逐渐学习到数据中的模式,从而提高预测的准确性。随着迭代的进行,模型的损失值应该逐渐减小,表示模型在不断改进。

总结

使用MSELoss作为损失函数并进行400次迭代训练的整个过程,是一个通过不断调整模型参数以最小化预测误差的过程。这个过程包括初始化模型和优化器、前向传播生成预测、计算损失、反向传播计算梯度以及更新模型参数。通过多次迭代,模型能够逐渐学习到数据的内在规律,从而提高其预测性能。

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在PyTorch中,可以使用`torch.nn.Conv2d()`模块对图像进行卷积操作。这个模块可以自动进行权重更新和梯度计算,是深度学习中常用的卷积操作模块之一。 下面是一个简单的Python代码示例,演示如何使用`torch.nn.Conv2d()`模块对图像进行卷积操作: ```python import torch import torch.nn as nn import numpy as np import cv2 # 读入图像 img = cv2.imread('image.jpg', 0).astype(np.float32) # 转换成Tensor,并添加一个维度 img_tensor = torch.from_numpy(img).unsqueeze(0).unsqueeze(0) # 定义卷积核 kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]]).astype(np.float32) kernel_tensor = torch.from_numpy(kernel).unsqueeze(0).unsqueeze(0) # 定义卷积模型 conv = nn.Conv2d(1, 1, kernel_size=3, padding=1, bias=False) # 将卷积核赋值给模型的权重 conv.weight.data = kernel_tensor # 对图像进行卷积 output_tensor = conv(img_tensor) # 将输出Tensor转换为numpy数组 output = output_tensor.squeeze().detach().numpy() # 显示原始图像和卷积后的图像 cv2.imshow('Original Image', img.astype(np.uint8)) cv2.imshow('Convolved Image', output.astype(np.uint8)) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个例子中,我们首先使用OpenCV读入一张灰度图像,并将其转换为PyTorch Tensor类型。然后,我们定义一个3x3的卷积核,并将其转换为Tensor类型。接着,我们定义一个`nn.Conv2d()`模块,并将其权重设置为卷积核。最后,我们将输入图像Tensor传递给卷积模块,并将输出Tensor转换为numpy数组,最终显示原始图像和卷积后的图像。 需要注意的是,`nn.Conv2d()`模块会自动处理输入和输出的通道数,因此需要在模块定义时指定输入和输出的通道数。在本例中,我们只使用了灰度图像,因此输入和输出通道数均为1。另外,我们还使用了`padding=1`参数来保持输出图像的大小与输入图像相同。你可以根据需要调整这些参数和卷积核的权重,以获得不同的卷积效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值