PyTorch学习之torch.nn.Conv2d函数

PyTorch学习之torch.nn.Conv2d函数

一、简介

torch.nn.Conv2d 是 PyTorch 中用于实现二维卷积层的类,这个类可以说是对torch.nn.functional.Conv2d的进一步封装,使其使用起来更加的傻瓜式。

二、基本语法

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')

三、参数说明

  • in_channels (int): 输入通道数,即输入图像的深度。例如,对于 RGB 图像,这个值通常为 3。
  • out_channels (int): 输出通道数,即卷积核的数量。每个卷积核会提取一个特征图。
  • kernel_size (int 或 tuple): 卷积核的大小。如果是正方形,可以只用一个整数表示,例如 3 表示 3x3 的卷积核。
  • stride (int 或 tuple, 可选): 卷积操作的步长,默认为 1
  • padding (int 或 tuple, 可选): 输入的每一边要填充的像素数,默认为 0
  • dilation (int 或 tuple, 可选): 卷积核元素之间的间距,默认为 1
  • groups (int, 可选): 控制输入和输出之间的连接方式,默认为 1groups 值大于 1 时,相当于对输入进行组卷积。
  • bias (bool, 可选): 如果 True,添加一个学习偏置,默认为 True
  • padding_mode (str, 可选): 填充模式,可以是 'zeros'(默认)、'reflect''replicate''circular'

四、返回值

返回一个卷积后的张量(特征图)

五、示例

示例 1: 真实图像卷积-普通卷积
import torch  
import torch.nn as nn 
import cv2 
import numpy as np 

# 读者若要测试,请更改图片路径
img = cv2.imread('2015.jpg') 

# 创建一个卷积层
conv_layer = nn.Conv2d(in_channels=3, out_channels=1, kernel_size=3, groups=1)  
print(conv_layer.weight.data.size())  

# 如果下面的代码取消注释,则我们将手动给卷积层分配参数,因为我们的卷积核大小为1
# 下面是手动设置卷积核参数的代码,被注释掉了
# conv_layer.weight.data = torch.nn.Parameter(torch.tensor(
#     [[[  # 定义一个3x3的卷积核,这里使用的是x轴边缘增强卷积核,这里不懂的可以看看我其他的关键数字图像处理的文章
#             [1, 0, -1],
#             [1, 0, -1],
#             [1, 0, -1]
#         ],
#       [
#             [1, 0, -1],
#             [1, 0, -1],
#             [1, 0, -1]
#         ],
#       [
#             [1, 0, -1],
#             [1, 0, -1],
#             [1, 0, -1]
#         ]
#       ]], dtype=torch.float32
# ))

# 做图像一般变换,变换成卷积层可以接收的形状,卷积层接收(N,C,W,H),但是OpenCV读取后的格式是(W,H,C)的格式
img = torch.tensor(img, dtype=torch.float32)  # 将图片转换为PyTorch张量
print(img.size()) 
img = img.unsqueeze(0)  # 添加一个批次维度
print(img.size())  
img = img.permute(0, 3, 1, 2)  # 调整维度顺序以符合卷积层的输入要求
print(img.size()) 

# 执行卷积操作
output_tensor = conv_layer(img)  # 将图片张量通过卷积层进行卷积操作

ResultImg = output_tensor.squeeze(0)  # 移除批次维度
print(ResultImg.size())  
ResultImg = ResultImg.permute(1, 2, 0)  # 调整维度顺序,以便于显示
print(ResultImg.size())  
ResultImg = ResultImg.detach().numpy().astype(np.uint8)  # 将PyTorch张量转换为NumPy数组,并转换数据类型为无符号8位整数
cv2.imshow('Conv2dFeatureMap', ResultImg)  
cv2.waitKey()  
cv2.destroyAllWindows()  
示例 2: 真实图像卷积-深度可分离卷积
import torch
import torch.nn as nn
import cv2
import numpy as np

# 读者若要测试,请更改图片路径
img = cv2.imread('2015.jpg')

# 创建一个卷积层
conv_layer = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=1, groups=3)
print(conv_layer.weight.data.size())
# 如果下面的代码取消注释,则我们将手动给卷积层分配参数,下面这组参数可以保证卷积后的特征图和原图一模一样,因为我们的卷积核大小为1,且输出RGB通道
# conv_layer.weight.data = torch.nn.Parameter(torch.tensor(
#     [[
#         [[1]],
#         [[1]],
#         [[1]]
#       ],
#      [
#         [[1]],
#         [[1]],
#         [[1]]
#       ],
#      [
#         [[1]],
#         [[1]],
#         [[1]]
#       ]
#      ], dtype=torch.float32
# ))

# 做图像一般变换,变换成卷积层可以接收的形状,卷积层接收(N,C,W,H),但是OpenCV读取后的格式是(W,H,C)的格式
img = torch.tensor(img, dtype=torch.float32)
print(img.size())
img = img.unsqueeze(0)
print(img.size())
img = img.permute(0, 3, 1, 2)
print(img.size())

# 执行卷积操作
output_tensor = conv_layer(img)

ResultImg = output_tensor.squeeze(0)
print(ResultImg.size())
ResultImg = ResultImg.permute(1, 2, 0)
print(ResultImg.size())
ResultImg = ResultImg.detach().numpy().astype(np.uint8)
cv2.imshow('Conv2dFeatureMap', ResultImg)
cv2.waitKey()
cv2.destroyAllWindows()

你可能感兴趣的:(#,torch,pytorch,学习,人工智能)