正向卷积:Conv2D()
举例:
... Conv2D(128, kernel_size=4, padding="same") # 128个过滤器(128维),卷积核大小为4,边缘填充 # 注:此处步长为默认值1,此时使用padding="same",输出数据的形状会保持不变(与输入一致) # 若步长不为1,则根据计算公式计算(后面会介绍)
升采样:UpSampling2D()
举例:
... model.add(Reshape((7, 7, 128)))# Reshape成以下形状 model.add(UpSampling2D())# 上采样,对数据进行插值,形状变成之前的两倍 --->(None, 14, 14, 128) ...
正向卷积:nn.Conv2d()
举例:
nn.Conv2d(256, 512, 4, stride=1, bias=False), ... # 输入256通道,输出512通道,卷积核为4,步长为1 # 注:这里的"通道"指卷积操作之后得到的"特征图"的数量,而不是数据的形状 # 数据形状计算按照公式
转置卷积:nn.ConvTranspose2d()【对应tf的tf.nn.conv2d_transpose】
举例:
nn.ConvTranspose2d(256, 128, 4, stride=2, bias=False) ... # 输入256通道,输出128通道,卷积核为4,步长为2,逻辑与Conv2d()类似
假设输入是一个正方形,宽度与高度相等
那么计算卷积输出大小的公式是:
L形括号的意义是取括号内数值的数学下限
例如:2.3 --> 2
例子:
# 输入形状是28,28,1 # 16个过滤器(16维),卷积核大小为3,步数2,边缘填充 model.add(Conv2D(16, kernel_size=3, strides=2, input_shape=self.img_shape, padding="same")) model.add(LeakyReLU(alpha=0.2)) model.add(Dropout(0.25)) ''' 这里的输出需要计算 [(14-3)+2]/2+1=6.5+1=6+1=7(下取整) 因此,经过下面卷积层后,数据的形状为(None, 7, 7, 32) ''' model.add(Conv2D(32, kernel_size=3, strides=2, padding="same"))# (None, 7, 7, 32)
同样的,若输出是方形张量,则计算转置卷积输出大小的公式是: