首页 > 其他分享 >6.2 图像卷积

6.2 图像卷积

时间:2023-07-27 16:23:12浏览次数:38  
标签:nn 卷积 torch 6.2 图像 grad conv2d size

我们定义一个函数,实现图像的卷积操作。

 这里X[i:i+h,j:j+w]的用法是把X这个大矩阵中,行数从i到i+h-1,列数从j到j+w-1的一小块给拿出来了,例子如下:

A = torch.tensor([
    [1,1,1,1],
    [2,2,2,2],
    [3,3,3,3],
    [4,4,4,4]
])
print(A[0:3,1:4])

输出结果:

 

1.卷积层

卷积层对输入和卷积核权重进行互相关运算,并在添加标量偏置之后产生输出。 所以,卷积层中的两个被训练的参数是卷积核权重和标量偏置。 就像我们之前随机初始化全连接层一样,在训练基于卷积层的模型时,我们也随机初始化卷积核权重。

基于上面定义的corr2d函数实现二维卷积层。在__init__构造函数中,将weightbias声明为两个模型参数。前向传播函数调用corr2d函数并添加偏置。

class Conv2D(nn.Module):
    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

 

2.学习卷积核

就像torch.nn中有全连接层nn.Linear()一样,torch.nn也有卷积层nn.Conv2d()。nn.Conv2d()有四个参数,分别是输入通道数、输出通道数、卷积核尺寸kernel_size,以及偏置bias。

我们学习一个横向的边缘检测卷积核。首先定义一个矩阵X:

 再定义我们希望的输出矩阵Y,Y的值是X经过1*2卷积核[1,-1]得到的:

 我们简单实现一个训练代码,来训练卷积核参数:

# 使用nn的内置卷积层,前两个参数分别表示输入、输出通道数
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))
lr = 3e-2  # 学习率

for i in range(10):
    Y_hat = conv2d(X)
    l = (Y_hat - Y) ** 2
    conv2d.zero_grad()
    l.sum().backward()
    # 迭代卷积核
    conv2d.weight.data[:] -= lr * conv2d.weight.grad
    if (i + 1) % 2 == 0:
        print(f'epoch {i+1}, loss {l.sum():.3f}')

这里面,梯度清零使用了conv2d.zero_grad(),conv2d是Conv2d类的对象,是nn.Module的子类的一个对象,应该是nn.Module都有这个.zero_grad()方法。

 

在3.2节,线性回归的从零开始实现中我们自己实现了sgd优化算法,如下:

def sgd(params, lr, batch_size):  #@save
    """小批量随机梯度下降"""
    with torch.no_grad():
        for param in params:
            param -= lr * param.grad / batch_size
            param.grad.zero_()

这里参数梯度的更新是使用参数本身的.grad.zero_()更新的。

 

标签:nn,卷积,torch,6.2,图像,grad,conv2d,size
From: https://www.cnblogs.com/pkuqcy/p/17584944.html

相关文章

  • Inpaint Anything:一键进行多种图像修补
    本文分享自华为云社区《绘制一切》,作者:雨落无痕。绘制一切-InpaintAnything相关链接:Notebook案例地址:绘制一切AIGallery:https://developer.huaweicloud.com/develop/aigallery/home.html也可通过AIGallery,搜索【绘制一切】一键体验!InpaintAnything通过一键点击标记选......
  • USB图像采集卡是什么
    USB图像采集卡是一种用于连接计算机和摄像机、摄像头或其他视频设备的设备。它充当了一个接口,使得视频信号可以通过USB接口传输到计算机,并且可以进行图像采集和处理,如实时监控、视频录制、图像分析等。USB图像采集卡的出现极大地方便了用户在计算机上进行视频采集和处理的需求。......
  • 基于深度学习的图像分割技术探究
    导言:图像分割是计算机视觉领域的重要任务,旨在将图像划分为不同的语义区域,实现对图像中感兴趣物体的定位和提取。深度学习作为图像分割的新兴技术,通过卷积神经网络(CNN)等模型,取得了显著的分割效果。本文将探究基于深度学习的图像分割技术的原理、应用以及面临的挑战。第一部分:基于......
  • python如何调节CT图像的亮度分辨率
    Python如何调节CT图像的亮度分辨率在医学图像处理中,调节CT图像的亮度分辨率是一个重要的任务,它可以用来增强图像的可视化效果和准确性。Python提供了强大的图像处理库,可以方便地对CT图像进行亮度分辨率调节。本文将介绍如何使用Python和OpenCV库来实现。问题描述假设我们有一张C......
  • 模型部署 — PaddleNLP 基于 Paddle Serving 快速使用(服务化部署 - Docker)— 图像识别
    目录流程版本安装Docker安装PaddleNLP安装环境准备模型准备压缩模型下载模型模型部署环境配置启动服务测试--暂时还没通过重启图像识别+信息抽取(UIE-X),部署接口供别的应用调用最终在自己部署的环境中识别时报错,不知道是不是和GPU有关,还在尝试中流程在百度BMLCodeLab......
  • 详解Python图像处理Pillow库
    在Python的图像处理领域,Pillow是一个强大而广泛使用的第三方库。它提供了丰富的图像处理功能,包括打开、保存、调整大小、裁剪、旋转等操作。本文将详细介绍Pillow库的使用方法,并通过代码示例进行讲解,帮助你理解和应用Pillow库进行图像处理。一、安装和导入Pillow库在使用Pillo......
  • 图像学-渲染管线
    渲染管线渲染管线功能将物体3D坐标转换为屏幕空间2D坐标为屏幕每个像素点进行着色渲染管线的流程顶点数据输入->顶点着色器->曲面细分过程->几何着色器->图元组装->裁剪剔除->光栅化->片段着色器以及混合测试顶点着色器:主要进行坐标变换。......
  • MFC-picture图像控件
            ......
  • Navicat16.2.3永久试用方法(16.2.5也支持)
    navicat16.2.3无限试用bat脚本,将下面代码保存为bat文件,双击打开就可以实现试用重置。如果亲测有用,就点个赞同支持一下@echooffsetdn=Infosetdn2=ShellFoldersetrp=HKEY_CURRENT_USER\Software\Classes\CLSID::regdeleteHKEY_CURRENT_USER\Software\PremiumSoft\Na......
  • 如何使用OpenCV库进行图像检测
    importcv2#加载Haar级联分类器face_cascade=cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')#读取输入图像img=cv2.imread('input_image.jpg')gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#使用Haar级联分类器进行人脸检测fa......