一维卷积:
将n行3列升维到n行6列。(原因:卷积核为6个)
*表示点乘
Linear线性层:
(通过矩阵计算改变输入输出特征向量的维度)
Pytorch nn.Linear的基本用法与原理详解-CSDN博客
pytorch初学笔记(十二):神经网络基本结构之线性层-CSDN博客
二维卷积:
torch学习 (十六):二维卷积层_torch 二维卷积定义-CSDN博客
神经网络基本搭建:torch.nn
对类初始化讲解的好的文章:
解惑(一) ----- super(XXX, self).__init__()到底是代表什么含义_super(,self).__init__-CSDN博客
CONV1D一维卷积神经网络运算过程(举例:n行3列➡n行6列)-CSDN博客
神经网络的基本框架的搭建-nn.Module-CSDN博客
神经网络类定义举例:
# Convolution operation
class ConvLayer(torch.nn.Module):
def __init__(self, in_channels, out_channels, kernel_size, stride, is_last=False):
super(ConvLayer, self).__init__()
reflection_padding = int(np.floor(kernel_size / 2))
#np.floor()向下取整
#kernel_size 卷积核的大小
self.reflection_pad = nn.ReflectionPad2d(reflection_padding)
self.conv2d = nn.Conv2d(in_channels, out_channels, kernel_size, stride)
self.dropout = nn.Dropout2d(p=0.5)
self.is_last = is_last
def forward(self, x):
out = self.reflection_pad(x)
out = self.conv2d(out)
if self.is_last is False:
# out = F.normalize(out)
out = F.relu(out, inplace=True)
# out = self.dropout(out)
return out
上面的代码定义了一个卷积操作类;
class ConvLayer(torch.nn.Module):
定义了类ConvLayer,继承自torch.nn.Module,也就是说torch.nn.Module是类ConvLayer的父类。
def __init__(self, in_channels, out_channels, kernel_size, stride, is_last=False):
super(ConvLayer, self).__init__()
reflection_padding = int(np.floor(kernel_size / 2))
#np.floor()向下取整
#kernel_size 卷积核的大小
self.reflection_pad = nn.ReflectionPad2d(reflection_padding)
self.conv2d = nn.Conv2d(in_channels, out_channels, kernel_size, stride)
self.dropout = nn.Dropout2d(p=0.5)
self.is_last = is_last
定义了ConvLayer的类初始化函数,在创建ConvLayer对象时自动调用,也就是说在创建对象的时候自己就初始化了,不需要再使用init函数。
def __init__(self, in_channels, out_channels, kernel_size, stride, is_last=False):
括号中是可以传入的参数。
super(ConvLayer, self).__init__()
这句代码的意思是说要将ConvLayer的实例(对象)self,转化为它的父类对象,也就是torch.nn.Module,再进行初始化。
reflection_padding = int(np.floor(kernel_size / 2))
reflection_padding=1
self.reflection_pad = nn.ReflectionPad2d(reflection_padding)
self.conv2d = nn.Conv2d(in_channels, out_channels, kernel_size, stride)
self.dropout = nn.Dropout2d(p=0.5)
self.is_last = is_last
在初始化中对ConvLayer的对象定义了四个属性,
reflection_pad属性:只往左右填充宽度为1的元素。
反射填充详解ReflectionPad2d(padding)-CSDN博客
conv2d属性:二维卷积
dropout属性:把某个张量置0
(Pytorch)nn.Dropout以及Dropout1d,Dropout2d,Dropout3d是什么意思_nn.dropout2d-CSDN博客
is_last属性:是不是最后一层
def forward(self, x):
out = self.reflection_pad(x)
out = self.conv2d(out)
if self.is_last is False:
# out = F.normalize(out)
out = F.relu(out, inplace=True)
# out = self.dropout(out)
return out
前向传播函数:self是类实例本身,x是传进来的参数。
将反射填充x后的ConvLayer类实例赋值给out,
对out进行2d卷积,
判断是不是最后一层卷积层,如果不是,对刚卷积的结果进行relu激活。
inplace为True,将会改变输入的数据 ,否则不会改变原输入,只会产生新的输出。
激活函数(ReLU):nn.ReLU(inplace=True)-CSDN博客
forward的返回结果为out。
总结:
init函数基本上定义的是类对象可以使用的参数和方法,(也就是说定义完实例对象实例对象拥有了一些参数和可以使用的功能),
然后使用这些参数和方法的是实例对象的forward函数。
实例对象通过调用forward函数来实现真正的卷积层。