我正在尝试创建一个基于扩张卷积的自动编码器。我对不同的 suntax 以及向下/向上采样方法感到困惑。我们如何只为保留输入和输出大小的一层做到这一点?
- 通过使用tf.nn.atrous_conv2d然后tf.nn.atrous_conv2d_transpose
- 通过使用 tf.nn.conv2d 然后tf.nn.conv2d_transpose
提前致谢
我正在尝试创建一个基于扩张卷积的自动编码器。我对不同的 suntax 以及向下/向上采样方法感到困惑。我们如何只为保留输入和输出大小的一层做到这一点?
- 通过使用tf.nn.atrous_conv2d然后tf.nn.atrous_conv2d_transpose
- 通过使用 tf.nn.conv2d 然后tf.nn.conv2d_transpose
提前致谢
我以前没有使用过膨胀,但我使用基于卷积的自动编码器。这是一个采用 28x28x1 输入大小的架构示例,例如 mnist 图像。使用 2 的步幅,大小将被下采样到 14x14x1,然后到 7x7x1。然后它将被展平,然后减小到 32,即编码大小。之后,一组步长为 2 的转置卷积层会将大小增加到 28x28x1。
这是代码示例:
def autoencoder_network(x):
encoder_14 = tf.layers.conv2d(x, filters=1, kernel_size=3, strides=2, padding='same', activation=tf.nn.relu)
encoder_7 = tf.layers.conv2d(encoder_14, filters=1,kernel_size=3, strides=2, padding='same', activation=tf.nn.relu)
flatten_dim = np.prod(encoder_7.get_shape().as_list()[1:])
flat = tf.reshape(encoder_7, [-1, flatten_dim])
code = tf.layers.dense(flat, 32, activation=tf.nn.relu)
hidden_decoder = tf.layers.dense(code, flatten_dim, activation=tf.nn.relu)
decoder_7 = tf.reshape(hidden_decoder, [-1, 7, 7, 1])
decoder_14 = tf.layers.conv2d_transpose(decoder_7, 1, 3, strides=2, padding='same', activation=tf.nn.relu)
output = tf.layers.conv2d_transpose(decoder_14, 1, 3, strides=2, padding='same', activation=tf.nn.relu)
return code, output
我做了如下的事情。似乎矩阵的大小是合理的。这是对的吗?
X=tf.random_uniform(shape=(256,256,3),minval=0,maxval=100,dtype=tf.float32,seed=None,name=None)
input2d = tf.reshape(X, [-1,256,256,3])
print(input2d.shape)
dilation_rate=2
in_channels=3
out_channels=32
kernelsize_h=4
kernelsize_w=4
filter = tf.get_variable("filter", [kernelsize_h, kernelsize_w, in_channels, out_channels], dtype=tf.float32, initializer=tf.random_normal_initializer(0, 0.02))
output=tf.nn.atrous_conv2d(input2d, filter, rate=dilation_rate, padding="SAME")
print(output.shape)
filterBack = tf.get_variable("filterBack", [kernelsize_h, kernelsize_w, in_channels,out_channels], dtype=tf.float32, initializer=tf.random_normal_initializer(0, 0.02))
output_shape=[1,256,256,3]
reversed=tf.nn.atrous_conv2d_transpose(output,filterBack,output_shape,rate=dilation_rate,padding="SAME")
print(reversed.shape)
结果是: (1, 256, 256, 3) (1, 256, 256, 32) (1, 256, 256, 3)