卷积
卷积在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='f