赞
踩
本节要点:
1 卷积层
2 池化层
3 非线性激活层
4 正则层
5 循环层
6 线性层
7 Dropout层
8 Sparse层
9 Veision层
10 Multi-GPU层
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) – 从输入通道到输出通道的阻塞连接数。制输入和输出之间的连接, group=1,输出是所有的输入的卷积;group=2,此时相当于有并排的两个卷积层,每个卷积层计算输入通道的一半,并且产生的输出是输出通道的一半,随后将这两个输出连接起来。
bias(bool, optional) - 如果bias=True,添加偏置
输入: (N,C_in,L_in)
输出: (N,C_out,L_out)
输入输出的计算方式:
L o u t = f l o o r ( ( L i n + 2 p a d d i n g − d i l a t i o n ( k e r n e r l s i z e − 1 ) − 1 ) / s t r i d e + 1 ) L_{out}=floor((L_{in}+2padding-dilation(kernerl_size-1)-1)/stride+1) Lout=floor((Lin+2padding−dilation(kernerlsize−1)−1)/stride+1)
变量是模型训练过程中要学习的对象,在卷积层中涉及两类:
weight(tensor) - 卷积的权重,大小是(out_channels, in_channels, kernel_size)
bias(tensor) - 卷积的偏置系数,大小是(out_channel)
下面给出一个构建一维卷积层的例子,并且感受一下输入输出的维度变化。
import torch
import torch.nn as nn
import torch.autograd as autograd
# 构建一个卷积层,inchannel是16需要与输入数据的channel一致
conv = nn.Conv1d(16, 33, 3, stride=2)
# 构建一个输如数据(比如20个样本,每个样本是16个channel, 每个channel是长度为50的一维向量)
input = autograd.Variable(torch.randn(20, 16, 50))
# 将数据输入卷积层进行前向计算(输出任然是20个样本,channel变成了33, 因为stride=2,因此每个channel中是一个长度24的一维向量)
output = conv(input)
print(output.size())
torch.Size([20, 33, 24])
二维和一维卷积的区别在于输入数据每个channel中是二维的还是一维的。一般我们输入的图像数据都是hight*width的二维图像。
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,添加偏置
二维中,参数kernel_size,stride,padding,dilation可以是一个int的数据,也可以是一个二元的tuple类型,里面分别是hight和width对应的数值。
input: (N,C_in,H_in,W_in)
output: (N,C_out,H_out,W_out)
H o u t = f l o o r ( ( H i n + 2 p a d d i n g [ 0 ] − d i l a t i o n [ 0 ] ( k e r n e r l s i z e [ 0 ] − 1 ) − 1 ) / s t r i d e [ 0 ] + 1 ) H_{out}=floor((H_{in}+2padding[0]-dilation[0](kernerl_size[0]-1)-1)/stride[0]+1) Hout=floor((Hin+2padding[0]−dilation[0](kernerlsize[0]−1)−1)/stride[0]+1)
W o u t = f l o o r ( ( W i n + 2 p a d d i n g [ 1 ] − d i l a t i o n [ 1 ] ( k e r n e r l s i z e [ 1 ] − 1 ) − 1 ) / s t r i d e [ 1 ] + 1 ) W_{out}=floor((W_{in}+2padding[1]-dilation[1](kernerl_size[1]-1)-1)/stride[1]+1) Wout=floor((Win+2padding[1]−dilation[1](kernerlsize[1]−1)−1)/stride[1]+1)
weight(tensor) - 卷积的权重,大小是(out_channels, in_channels,kernel_size)
bias(tensor) - 卷积的偏置系数,大小是(out_channel)
# 构建一个二维卷积层, strie可以是Int值,表示height,width都对应1
conv = nn.Conv2d(16, 33, 3, stride=2)
# 也可以是tuple
conv = nn.Conv2d(16, 33, (3,5), stride=(2,1), padding=(4, 2), dilation=(3, 1))
# 构建输入数据,16个channel, 每个channel中是50*100的二维矩阵
input = autograd.Variable(torch.randn(20, 16, 50, 100))
# 前向计算,注意输出维度的变化
output = conv(input)
print(output.size())
torch.Size([20, 33, 26, 100])
input: (N,C_in,D_in,H_in,W_in)
output: (N,C_out,D_out,H_out,W_out)
D o u t = f l o o r ( ( D i n + 2 p a d d i n g [ 0 ] − d i l a t i o n [ 0 ] ( k e r n e r l s i z e [ 0 ] − 1 ) − 1 ) / s t r i d e [ 0 ] + 1 ) D_{out}=floor((D_{in}+2padding[0]-dilation[0](kernerl_size[0]-1)-1)/stride[0]+1) Dout=floor((Din+2padding[0]−dilation[0](kernerlsize[0]−1)−1)/stride[0]+1)
H o u t = f l o o r ( ( H i n + 2 p a d d i n g [ 1 ] − d i l a t i o n [ 2 ] ( k e r n e r l s i z e [ 1 ] − 1 ) − 1 ) / s t r i d e [ 1 ] + 1 ) H_{out}=floor((H_{in}+2padding[1]-dilation[2](kernerl_size[1]-1)-1)/stride[1]+1) Hout=floor((Hin+2padding[1]−dilation[2](kernerlsize[1]−1)−1)/stride[1]+1)
W o u t = f l o o r ( ( W i n + 2 p a d d i n g [ 2 ] − d i l a t i o n [ 2 ] ( k e r n e r l s i z e [ 2 ] − 1 ) − 1 ) / s t r i d e [ 2 ] + 1 ) W_{out}=floor((W_{in}+2padding[2]-dilation[2](kernerl_size[2]-1)-1)/stride[2]+1) Wout=floor((Win+2padding[2]−dilation[2](kernerlsize[2]−1)−1)/stride[2]+1)
参数个变量与一维和二维都是一样的。
因为是三维的,参数kernel_size,stride,padding,dilation可以是一个int的数据,也可以是一个三元的tuple类型。
下面给出一个例子:
# With square kernels and equal stride
m = nn.Conv3d(16, 33, 3, stride=2)
# non-square kernels and unequal stride and with padding
m = nn.Conv3d(16, 33, (3, 5, 2), stride=(2, 1, 1), padding=(4, 2, 0))
input = autograd.Variable(torch.randn(20, 16, 10, 50, 100))
output = m(input
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。