各个卷积层的上方是通道数channels,初始图像是128*128*128*2,代表(x,y,z,c)每一层的卷积核数量number of kernel有多少,
就代表经过这一层卷积后的输出图像的通道数有多少,论文的代码中初始channel设为16,下采样的过程中每次卷积的卷积核的数量都会乘2
初始参数:
输入图像尺寸:n*n*n=128*128*128
padding=0
f=3
strde s=2
根据公式(公式链接)
得出输出图像尺寸为(128+0-3)/2+1=63,但这是跟代码中的注释不符的,代码中明确标明第一层后的图像尺寸变为了64*64*64,
我一开始认为:这里是向上取整的,否则后续的所有计算都不正确。
但后来发现这是不对的,因为我注意到了代码中的边缘填充padding并不是0
def convolve(opName, inputLayer, outputChannel, kernelSize, stride, stddev=1e-2, reuse=False, weights_init='uniform_scaling'):
return tflearn.layers.conv_3d(inputLayer, outputChannel, kernelSize, strides=stride,
padding='same', activation='linear', bias=True, scope=opName, reuse=reuse, weights_init=weights_init)
被用到的填充方法叫做Same卷积,那意味你填充后,你的输出大小和输入大小是一样的。
如果你想让n+2p-f+1=n的话,使得输出和输入大小相等,如果你用这个等式求解p,那么p=(f-1)/2。也就是p=1
那么重新计算就变成了了(128+2*1-3)/2+1=64,这样就对了
当从4-1到4-2时,4-1的大小是8*8*8,但到达4-2时步长设为了1
根据公式就变成了(8+2*1-3)/1+1=8,尺寸依然没有变,同时这里的卷积核数量也没有变,通道也就没变。
在padding为same时,公式也可以写成ceil(n/s),ceil代表向上取整
conv4 = convolveLeakyReLU(
'conv4', conv3_1, c*8, 3, 2) # 16 * 16 * 16
conv4_1 = convolveLeakyReLU('conv4_1', conv4, c*8, 3, 1)