Tensorflow中实现反卷积过程(de-convolution/convolution transpose)

卷积神经网络是深度学习中一个很流行的网络模型,

它的原理和过程我就不在此介绍了,感兴趣的可以去看一下https://blog.csdn.net/kane7csdn/article/details/83617086


在这里,介绍一下反卷积过程(可以叫做deconvolution,或者也可以称作convolution transpose)。

反卷积也可以理解为逆卷积,顾名思义,卷积的逆过程。

我们如果把用卷积网络提取数据特征看作一个压缩过程,或者编码过程。

那么反卷积过程便可以叫做解压过程,或者解码过程。

2018/12/3更正:其实下图主要作用为语义分割

这是一张来自 Learning Deconvolution Network for Semantic Segmentation 的介绍图。


下面我们用一个简单的代码例子来实现一下反卷积过程。

原始数据为一个4*4矩阵:

[[1. 2. 3. 4.]
 [2. 3. 4. 5.]
 [3. 4. 5. 6.]
 [4. 5. 6. 7.]]

要求通过卷积+反卷积过程,尽可能的还原这个矩阵。

需要说明的是,通常一个卷积网络包含有卷积层+池化层,这里为了方便演示,仅包含卷积层

另外,在本例子中因为只存在卷积层,且padding方式为same,所以不存在数据的丢失,因此反卷积的效果很好。

但实际项目中,由于池化层的存在,反卷积难以完全还原初始数据。

import tensorflow as tf
import numpy as np

data = np.array(([1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6, 7]), dtype=float)
data = data.reshape((1, 4, 4, 1))

Data = tf.placeholder(tf.float32, (None, 4, 4, 1))
conv1 = tf.layers.conv2d(
    inputs=Data,
    filters=1,
    kernel_size=[2, 2],
    strides=[1, 1],
    padding="same"
)
deconv1 = tf.layers.conv2d_transpose(
    inputs=conv1,
    filters=1,
    kernel_size=[2, 2],
    strides=[1, 1],
    padding="same"
)
cost = tf.reduce_mean(tf.pow(deconv1 - Data, 2))
optimizer = tf.train.AdamOptimizer(0.01).minimize(cost)

with tf.Session() as sess:
    tf.global_variables_initializer().run()
    for epoch in range(1000):
        _, loss = sess.run([optimizer, cost], feed_dict={Data: data})
        if (epoch+1) % 100 == 0:
            print("# Epoch %d, loss= %.2f" % (epoch+1, loss))
    print(data.reshape((4, 4)))
    deconv1_run = sess.run(deconv1, feed_dict={Data: data})
    print(deconv1_run.reshape((4, 4)))

# Epoch 100, loss= 0.55
# Epoch 200, loss= 0.29
# Epoch 300, loss= 0.15
# Epoch 400, loss= 0.07
# Epoch 500, loss= 0.04
# Epoch 600, loss= 0.02
# Epoch 700, loss= 0.01
# Epoch 800, loss= 0.01
# Epoch 900, loss= 0.00
# Epoch 1000, loss= 0.00
[[1. 2. 3. 4.]
 [2. 3. 4. 5.]
 [3. 4. 5. 6.]
 [4. 5. 6. 7.]]
[[1.0833378 1.9922134 2.9193594 3.9001908]
 [2.0152264 3.0306787 4.005212  5.048442 ]
 [3.0097656 4.005212  4.979745  6.0332966]
 [4.026579  5.0057573 5.9834356 6.9873247]]

经过反卷积重塑的矩阵与原矩阵非常相似。


用一个更加直观的例子,模拟生产一组三轴传感器信号:

(画图相关的代码略去了)

import tensorflow as tf
import numpy as np

data = 10 * np.random.random(size=120)
data = data.reshape((1, 3, 40, 1))

Data = tf.placeholder(tf.float32, (None, 3, 40, 1))
conv1 = tf.layers.conv2d(
    inputs=Data,
    filters=1,
    kernel_size=[3, 2],
    strides=[1, 1],
    padding="same"
)
deconv1 = tf.layers.conv2d_transpose(
    inputs=conv1,
    filters=1,
    kernel_size=[3, 2],
    strides=[1, 1],
    padding="same"
)
cost = tf.reduce_mean(tf.pow(deconv1 - Data, 2))
optimizer = tf.train.AdamOptimizer(0.01).minimize(cost)

with tf.Session() as sess:
    tf.global_variables_initializer().run()
    for epoch in range(1000):
        _, loss = sess.run([optimizer, cost], feed_dict={Data: data})
        if (epoch+1) % 100 == 0:
            print("# Epoch %d, loss= %.2f" % (epoch+1, loss))
    deconv1_run = sess.run(deconv1, feed_dict={Data: data})

效果:# Epoch 1000, loss= 0.51

对比一下:

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值