PyTorch构建卷积层

  • 二维图像卷积
    • 一、 二维卷积层的实现
      • 1. 手动实现二维卷积层
      • 2. Pytorch的卷积层API实现
    • 二、 二维卷积层的填充和步幅

二维图像卷积

使用全连接层来处理图片时,如果图片的尺寸比较大,那么就会出现参数爆炸的情况,模型复杂度直线提升而难以训练。为了降低模型的复杂度,提出了卷积层的概念。
卷积层是在全连接层的基础上,对于参数的取值加以限制来降低模型的复杂度。基于这样两种假设:
- 平移不变性:
- 局部性原理:
在这两种假设的基础上,卷积层大大减低了参数的数量。

一、 二维卷积层的实现

1. 手动实现二维卷积层

import torch
from torch import nndef corr2d(X, K):"""计算二维相关运算"""h, w = K.shapeY = torch.zeros(X.shape[0] - h + 1, X.shape[1] - w + 1)for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i, j] = (X[i:i+h, j:j+w] * K).sum()return Yclass Conv2D(nn.Module):"""2维卷积层"""def __init__(self, kernel_size):super().__init__()self.weight = nn.Parameter(torch.rand(kernel_size))self.bias = nn.Parameter(torch.zeros(1))def forward(self, x):return corr2d(x, self.weight) + self.bias# 测试Conv2D是否正确
# 生成输入样本X
>>>X = torch.ones((6, 8))
>>>X[:, 2:6] = 0
>>>X
>tensor([[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.]])# 定义卷积核K,使用corr2d得到输出Y
>>>K = torch.tensor([[1.0, -1.0]])
>>>Y = corr2d(X, K)
>>>Y
>tensor([[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.]])# 实例化卷积模型,使用{X, Y}作为数据,训练模型参数K
conv2d = Conv2D(kernel_size=(1,2))>>>for i in range(10):
>>>    Y_hat = conv2d(X)
>>>    l = (Y_hat- Y)**2
>>>    conv2d.zero_grad()
>>>    l.sum().backward()
>>>    conv2d.weight.data[:] -= 3e-2 * conv2d.weight.grad
>>>    if (i + 1)%2 == 0:
>>>        print(f'batch {i+1}, loss {l.sum():.3f}')
>batch 2, loss 7.240
batch 4, loss 1.494
batch 6, loss 0.365
batch 8, loss 0.108
batch 10, loss 0.037# 查看训练结果
>>>conv2d.weight.data
>tensor([[ 1.0058, -0.9686]])

2. Pytorch的卷积层API实现

class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
二维卷积层, 输入的尺度是(N, C_in,H,W)(批量大小,输入通道数,*输入尺寸),输出尺度(N,C_out,H_out,W_out)(批量大小,输出通道数,*输出尺寸)。
参数
in_channels(int) – 输入信号的通道
out_channels(int) – 卷积产生的通道
kerner_size(int or tuple) - 卷积核的尺寸
stride(int or tuple, optional) - 卷积步长
padding (int or tuple, optional)- 输入的每一条边补充0的层数
dilation(int or tuple, `optional``) – 卷积核元素之间的间距
groups(int, optional) – 从输入通道到输出通道的阻塞连接数
bias(bool, optional) - 如果bias=True,添加偏置
训练变量
weight(tensor) - 卷积的权重,大小是(out_channels, in_channels, kernel_size)
bias(tensor) - 卷积的偏置系数,大小是(out_channel)

import torch
from torch import nn# 测试Conv2D是否正确
# 生成输入样本X
>>>X = torch.ones((6, 8))
>>>X[:, 2:6] = 0
>>>X
>tensor([[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.]])# 定义卷积核K,使用corr2d得到输出Y
>>>K = torch.tensor([[1.0, -1.0]])
>>>Y = corr2d(X, K)
>>>Y
>tensor([[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.]])# 实例化卷积模型,使用{X, Y}作为数据,训练模型参数K
conv2d = nn.Conv2d(1, 1, kernel_size=(1,2), bias=False)
X = X.reshape((1, 1, 6, 8))
Y = Y.reshape((1, 1, 6, 7))>>>for i in range(10):
>>>    Y_hat = conv2d(X)
>>>    l = (Y_hat- Y)**2
>>>    conv2d.zero_grad()
>>>    l.sum().backward()
>>>    conv2d.weight.data[:] -= 3e-2 * conv2d.weight.grad
>>>    if (i + 1)%2 == 0:
>>>        print(f'batch {i+1}, loss {l.sum():.3f}')
>batch 2, loss 3.821
batch 4, loss 1.196
batch 6, loss 0.428
batch 8, loss 0.165
batch 10, loss 0.066# 查看训练结果
>>>conv2d.weight.data
>tensor([[[[ 1.0198, -0.9673]]]])

二、 二维卷积层的填充和步幅

卷积会使得图像的大小逐渐减小,一个HW大小的图像,使用kk的卷积核,输出大小会降低为 (H - K + 1)( W - K + 1)。这会限制掉模型可以构建的最大深度。
填充是为了解决这个问题而出现的。填充就是在图像的四周加入额外的行和列,行列填充 P 行/列时,输出大小就变成了(H - K + P + 1)
( W - K + P + 1)。
一般来说,使用填充是为了保持输入输出大小相同,所以,一般P的取值为 P = K - 1。
步幅是指卷积核在图像上滑动的步长,合理使用步长可以快速调整图像是尺寸。一般设置为2,将图像尺寸缩小一半。

import torch
from torch import nn# 定义函数,查看卷积输出尺寸
def comp_conv2d(conv2d, x):x = x.reshape((1,1) + x.shape)Y = conv2d(x)return Y.reshape(Y.shape[2:])# 定义卷积层,核 3*3,填充为1*1,输出尺寸不变
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1)
x =  torch.rand(size=(8, 8))
comp_conv2d(conv2d, x).shape
output: torch.Size([8, 8])# 定义卷积层,核 5*3,填充为2*1,输出尺寸不变
conv2d = nn.Conv2d(1, 1, kernel_size=(5, 3), padding=(2, 1))
x =  torch.rand(size=(8, 8))x =  torch.rand(size=(8, 8))
comp_conv2d(conv2d, x).shape
output: torch.Size([8, 8])# 定义卷积层,核 3*3,填充为1*1,步幅为1,输出尺寸减半
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1)
x =  torch.rand(size=(8, 8))
comp_conv2d(conv2d, x).shape
output: torch.Size([4, 4])

PyTorch构建卷积层相关推荐

  1. 使用PyTorch构建卷积GAN源码(详细步骤讲解+注释版) 02人脸图片生成 上

    阅读提示:本篇文章的代码为在普通GAN代码上实现人脸图片生成的修改,文章内容仅包含修改内容,全部代码讲解需结合下面的文章阅读. 相关资料链接为:使用PyTorch构建GAN生成对抗 本次训练代码使用了 ...

  2. pytorch基于卷积层通道剪枝的方法

    pytorch基于卷积层通道剪枝的方法 原文:https://blog.csdn.net/yyqq7226741/article/details/78301231 本文基于文章:Pruning Con ...

  3. 三分钟完全了解PyTorch中卷积层内部计算方法和权值初始值的来历,让你对模型有更深层次的理解

    首先先说明第一个答案,也就是PyTorch中卷积层的计算方法,其实这点很多人可能在书上已经看过图了,我只是用代码复现一遍 我们把所有变量都明确,首先是输入变量,我们设为2 * 2的全1矩阵,如下: 然 ...

  4. Pytorch中卷积层转向全连接层时,全连接层输入维度的确定

    Pytorch中卷积层转向全连接层时,全连接层输入维度的确定 一.代码法: 改变的AlexNet网络结构: AlexNet 二.公式法: 一.代码法: 改变的AlexNet网络结构: 输入维度为 ( ...

  5. 反卷积原理 + pytorch反卷积层参数output_padding

    一般我们会认为2维卷积的计算分为了以下3类: 1.full   2.same   3. valid 参考:https://cn.mathworks.com/help/matlab/ref/conv2. ...

  6. pytorch实现卷积层和BN层融合

    批归一化 数据的规范化也即(x−mean(x)/var(x))(x-mean(x)/var(x))(x−mean(x)/var(x)) 可以将数据的不同特征规范到均值为0,方差相同的标准正态分布,这就 ...

  7. PyTorch之—卷积层、激活层、BN

    文章目录 一.卷积层 二.池化层 三.归一化(BN) 一.卷积层 class torch.nn.Conv2d(in_channels, out_channels, kernel_size, strid ...

  8. pytorch中卷积层的使用方法

    1. 官方文档解释 如图为卷积层的参数汇总: 1.kernel_size: 指卷积核,一般情况下定义大小,这里我们只需要定义其size,而对于其中的参数会自动进行采样,会在训练过程中不断的进行调整. ...

  9. Educoder 机器学习 神经网络 第四关:使用pytorch搭建卷积神经网络识别手写数字

    任务描述 相关知识 卷积神经网络 为什么使用卷积神经网络 卷积 池化 全连接网络 卷积神经网络大致结构 pytorch构建卷积神经网络项目流程 数据集介绍与加载数据 构建模型 训练模型 保存模型 加载 ...

最新文章

  1. 美多商城之用户中心(用户基本信息)
  2. php处理html5文件上传代码,HTML5中文件上传的代码
  3. DataGrid控件读取具体某行某列的值、获取总列数
  4. 【UIKit】UILabel使用
  5. mplayer最全的命令
  6. Azure虚拟机网站部署 防火墙设置
  7. Arch Linux 安装总结
  8. Redis-6.2.5 安装 Linux环境(单机)
  9. Sqli-labs less 53
  10. Transformer靠什么得以闯入CV界秒杀CNN?
  11. Firefox改变查看页面源代码的程序
  12. 用VB轻松调用其他程序
  13. OWOD:开放世界目标检测,更贴近现实的检测场景 | CVPR 2021 Oral
  14. 关于docker容器启动后,浏览器无法正常访问相关问题——docker 宿主机与容器不通
  15. ios 设置导航栏背景色
  16. 免费福利 Unity3D 项目资源分享链接(消消乐、斗地主、AR等)
  17. 图片哈希概述(image hash)
  18. Map接口总结与HashMap源码分析
  19. easyExcel导出excel文件并打包成zip压缩包下载
  20. android listview嵌套progreesbar更新进度 ftp

热门文章

  1. (多图)Unity 2D 光照---------添加法线贴图
  2. 上网必备!这些网站绝对是互联网宝藏!带你进入全新的在线世界
  3. pytorch函数unsqueeze函数的理解
  4. 书论79 笪重光《书筏》
  5. div设置背景图片自适应
  6. 梯度爆炸(Exploding Gradients)
  7. HTML、XHTML、CSS与JavaScript入门经典pdf
  8. Word 表格填写信息(XX 证券案例)
  9. nginx配置https协议
  10. docker配置daemon.json或docker.service后重启docker报错的问题