pytorch的一些学习记录/困惑/笔记等(持续更新)

Matconvnet的相关学习记录、困惑、学习笔记等,持续更新。

向网络中添加一个网络层

关于卷积的一些参数

kernel_size为卷积核的大小,可以设置成长宽相等,也可以设置成长宽不等;同样的,stride、dilate也可以相等或者不相等,不相等的时候需要用向量进行表示,[h,w]。

添加卷积层

net=dagnn.DagNN()表示新建一个空的网络,使用net.addLayer()向网络中添加网络层。net.addLayer()的使用为

1
net.addLayer(layer_name,layer,input_vars_name,output_vars_name,params_name)

其中,layer_name为网络层的名字,网络层的名字需要在整个网络中是唯一的。input_vars_name为网络层的输入变量的名字,可以是一个string也可以是一个cell数组,这些输入变量的名字在该网络中的所有变量中也是唯一的,不具有二义性,让网络在运行的时候可以准确地找到该变量。当input_vars_name是一个string时,表示网络层只有一个输入,当是一个长度大于1的cell数组时,表示当前网络层有多个输入。output_vars_name表示网络层的输出变量的名字,同理,可以有一个或多个输出变量。params_name表示网络层参数的名字,比如当前网络层是一个卷积层的时候,有filters和biases这两个参数。当网络层没有训练参数的时候,就不需要输入params_name 。

net.addLayer()的第二个参数是layer,表示一个网络层的实例。在代码1中,这个layer是一个卷积层的实例。使用dagnn.Conv()生成了一个卷积层的实例,输入的参数有size,stride、pad、dilate和hasBias,分别是卷积核的大小、步长、图像上下左右的padding、扩张率,以及卷积层中是否有biases参数。注意到这里的卷积核的size是一个1×4的向量,分别[height width input_channel output_channel],当hasBias为false的时候,卷积层没有biases参数,此卷积层的参数就只有卷积核。

这里进行小结,添加一个网络层的时候,需要指定网络层的名字、网络层的实例、输入变量的名字、输出变量的名字和网络层参数名字,这些名字在网络中需要是唯一的。通过指定唯一的名字,网络在运行的时候会到对应的struct array中获取输入变量,或是将运行结果存放到对应的位置。

1
2
3
4
5
6
7
% 代码1 添加一个卷积层
net = dagnn.DagNN();
net.addLayer('conv_layer_name',... % layer name
dagnn.Conv('size', [4,4,3,1], 'stride', 1, 'pad', 0, 'dilate', 1, 'hasBias', true),... % layer
'input_var_name',... % input var name
'output_var_name',... % output var name
{'filters_name', 'biases_name'}); % params name

如代码2所示,是向生成器中添加一个logistics loss层。在net.addLayer()函数的输入参数中,loss_layer是当前网络的层的名字,dagnn.Loss()是一个loss层的实例,dagnn.Loss中有多种loss供选择,在这里使用logistics loss,如要使用softmaxlog可以表示为dagnn.Loss(‘loss’,’softmaxlog’) 。而{‘conv_5_output’,’labels’}表示网络层的输入变量分别是conv_5_output和labels 。net.addLayer()的第四个参数loss,是输出变量的名字。由于该网络层没有参数,所以传入训练参数的名字。

1
2
3
4
5
%代码2 添加一个logistics loss层
net.addLayer('loss_layer',...
dagnn.Loss('loss', 'logistic'), ...
{'conv_5_output', 'labels'},...
'loss');

如代码3所示,表示向网络中添加一个反卷积层,其中的一些参数之前已经介绍过了,这里不再赘述。讲一些添加反卷积层和卷积层的不同之处,反卷积的卷积核为[height width output_channel input_channel],注意到,output_channel和input_channel的位置与卷积层的使用方式相反,upsample表示上采样,upsample=1的时候为正常卷积,upsample>1的时候,先对输入数据进行上采样再进行卷积操作,可以将这里的upsample看成是步长。

1
2
3
4
5
6
%代码3 添加一个conv transpose层
net.addLayer('convt_6',... % layer name
dagnn.ConvTranspose('size', [4,4,1,16], 'upsample', 1, 'crop', 0, 'hasBias', true),... % layer
last_added.var,... % input var name
'convt_6_output',...% output var name
{'convt_6_filters', 'convt_6_biases'}); % params name

如代码4所示,表示向网络中添加一个sigmoid激活层。

1
2
3
4
5
% 代码4 添加一个sigmoid激活层
net.addLayer('sigmoid_layer', ...
dagnn.Sigmoid(), ...
'convt_6_output',...
'generator_output');

如代码5所示,向网络中添加一个batch norm层,如代码6所示,向网络中添加一个relu层,跟之前添加网络层的方法相同,需要指定网络层的名字、输入变量的名字、输出变量的名字和网络层参数的名字。

1
2
3
4
5
6
%代码5 添加一个batch norm 层
net.addLayer('batch_norm_layer', ... % layer name
dagnn.BatchNorm('numChannels', in_channels, 'epsilon', 1e-5), ... % layer
'convt_output', ... % input var name
'batch_norm_output', ... % output var name
{'bn_w', 'bn_b', 'bn_m'}) ; % params name

本文标题:pytorch的一些学习记录/困惑/笔记等(持续更新)

文章作者:Zeyuxiao

发布时间:2019年09月23日 - 10:09

最后更新:2019年09月23日 - 11:09

原始链接:https://zeyuxiao1997.github.io/2019/09/23/matlab-conv/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。