赞
踩
卷积在pytorch中有两种方式,一种是torch.nn.Conv2d(),一种是torch.nn.functional.conv2d()。
这两种形式的卷积对于输入的要求是一样的,首先需要输入一个torch.autograd.Variable()的类型,大小是(batch,channel,H,W),其中batch是输入的一批数据的数目,第二个是通道数,一般彩色图是3,灰度图是1,而卷积网络过程中的通道数比较大,会出现几十到几百的通道数,H和w是输入图片的高度和宽度,比如一个batch是32的图片,每张图片是3通道,高和宽是50和100,那么输入的大小就是(32,3,50,100)。
PyTorch中有函数torch.nn.Conv2d来实现卷积。
- torch.nn.Conv2d(
- in_channels, #输入的通道数
- out_channels, #输出的通道数
- kernel_size, #卷积核大小
- stride=1, #卷积核移动步长
- padding=0, #补0的多少
- dilation=1, #kernel间距
- groups=1, #卷积核个数
- bias=True
- )
例如:
定义一个能够检测边缘的卷积核
- #使用nn.Conv2d
- conv1 = nn.Conv2d(1,1,3,bias=False) #定义卷积
- sobel_kernel = np.array([-1,-1,-1],[-1,8,-1],[-1,-1,-1],dtype='float32') #定义轮廓检测算子
- sobel_kernel = sobel_kernel.reshape((1,1,3,3)) #重新设置成卷积网络需要的格式,输入输出1,长宽3
- conv1.weight.data = torch.from_numpy(sobel_kernel) #给卷积核赋值
-
- #将检测边缘的kernel作用到图片上
- edge = conv(Variable(img)) #注意图片转化Variabl
举例两种卷积方式:
- import numpy as np
- import torch
- from torch import nn
- from torch.autograd import Variable
- import torch.nn.functional as F
- from PIL import Image
- import matplotlib.pyplot as plt
- %matplotlib inline
- im = Image.open('./cat.png').convert('L') #读入一张灰度图的图片
- im = np.array(im,dtype='float32') #将其转换为一个矩阵
- #可视化图片
- plt.imshow(im.astype('uint8'),cmap='gray')
- #将图片转化为pyorch tensor,并适配卷积输入的要求
- im = torch.from_numpy(im.reshape((1,1,im.shape[0],im.shape[1])))
下面定义一个算子对其进行轮廓检测
- #使用nn.Conv2d
- conv1 = n.Conv2d(1,1,3,bias=False) #定义卷积
- sobel_kernel = np.array([-1,-1,-1],[-1,8,-1],[-1,-1,-1],dtype='float32') #定义轮廓检测算子
- #定义轮廓检测算子
- sobel_kernel = sobel_kernel.reshape((1,1,3,3)) #重新设置成卷积网络需要的格式ÿ
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。