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