VM_*_*_AI 22 conv-neural-network tensorflow deconvolution
是否有TensorFlow原生函数可以解卷积网络解开?
我已经在普通的python中写了这个,但是当它想要将它翻译成TensorFlow时变得越来越复杂,因为它的对象目前甚至不支持项目分配,我认为这对TF来说非常不方便.
Sha*_*gas 14
我不认为有一个官方的解放层,这是令人沮丧的,因为你必须使用图像调整大小(双线性插值或最近邻居),这就像一个普通的解放操作,它是非常缓慢的.查看"图像"部分中的tf api,您将找到它.
Tensorflow有一个maxpooling_with_argmax的东西,你可以获得maxpooled输出以及激活贴图,这是很好的,因为你可以在unpooling层中使用它来保存'丢失'的空间信息,但似乎没有这样的解开操作可以.我猜他们计划很快添加它.
编辑:我发现一些人在google讨论一周前似乎已经实现了类似的东西,但我个人还没有尝试过. https://github.com/ppwwyyxx/tensorpack/blob/master/tensorpack/models/pool.py#L66
这里有几个实现WhatWhereAutoencoder.py
即:
1)利用输出的unpool操作(源)tf.nn.max_pool_with_argmax.虽然请注意,从tensorflow 1.0开始,仅限tf.nn.max_pool_with_argmaxGPU
2)通过用零或最大元素的副本填充未池区域的位置来模拟最大池的逆的上采样操作.与tensorpack相比,它允许复制元素而不是零,并支持除了之外的步幅[2, 2].
没有重新编译,反向支持友好.
我正在寻找最大的解放操作并试图实现它.我想出了一些关于渐变的hacky实现,因为我正在与CUDA挣扎.
代码在这里,您需要从GPU支持构建它.以下是演示应用程序.不过没有保修!
此操作也存在未解决的问题.
import tensorflow as tf
import numpy as np
def max_pool(inp, k=2):
return tf.nn.max_pool_with_argmax_and_mask(inp, ksize=[1, k, k, 1], strides=[1, k, k, 1], padding="SAME")
def max_unpool(inp, argmax, argmax_mask, k=2):
return tf.nn.max_unpool(inp, argmax, argmax_mask, ksize=[1, k, k, 1], strides=[1, k, k, 1], padding="SAME")
def conv2d(inp, name):
w = weights[name]
b = biases[name]
var = tf.nn.conv2d(inp, w, [1, 1, 1, 1], padding='SAME')
var = tf.nn.bias_add(var, b)
var = tf.nn.relu(var)
return var
def conv2d_transpose(inp, name, dropout_prob):
w = weights[name]
b = biases[name]
dims = inp.get_shape().dims[:3]
dims.append(w.get_shape()[-2]) # adpot channels from weights (weight definition for deconv has switched input and output channel!)
out_shape = tf.TensorShape(dims)
var = tf.nn.conv2d_transpose(inp, w, out_shape, strides=[1, 1, 1, 1], padding="SAME")
var = tf.nn.bias_add(var, b)
if not dropout_prob is None:
var = tf.nn.relu(var)
var = tf.nn.dropout(var, dropout_prob)
return var
weights = {
"conv1": tf.Variable(tf.random_normal([3, 3, 3, 16])),
"conv2": tf.Variable(tf.random_normal([3, 3, 16, 32])),
"conv3": tf.Variable(tf.random_normal([3, 3, 32, 32])),
"deconv2": tf.Variable(tf.random_normal([3, 3, 16, 32])),
"deconv1": tf.Variable(tf.random_normal([3, 3, 1, 16])) }
biases = {
"conv1": tf.Variable(tf.random_normal([16])),
"conv2": tf.Variable(tf.random_normal([32])),
"conv3": tf.Variable(tf.random_normal([32])),
"deconv2": tf.Variable(tf.random_normal([16])),
"deconv1": tf.Variable(tf.random_normal([ 1])) }
## Build Miniature CEDN
x = tf.placeholder(tf.float32, [12, 20, 20, 3])
y = tf.placeholder(tf.float32, [12, 20, 20, 1])
p = tf.placeholder(tf.float32)
conv1 = conv2d(x, "conv1")
maxp1, maxp1_argmax, maxp1_argmax_mask = max_pool(conv1)
conv2 = conv2d(maxp1, "conv2")
maxp2, maxp2_argmax, maxp2_argmax_mask = max_pool(conv2)
conv3 = conv2d(maxp2, "conv3")
maxup2 = max_unpool(conv3, maxp2_argmax, maxp2_argmax_mask)
deconv2 = conv2d_transpose(maxup2, "deconv2", p)
maxup1 = max_unpool(deconv2, maxp1_argmax, maxp1_argmax_mask)
deconv1 = conv2d_transpose(maxup1, "deconv1", None)
## Optimizing Stuff
loss = tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(deconv1, y))
optimizer = tf.train.AdamOptimizer(learning_rate=1).minimize(loss)
## Test Data
np.random.seed(123)
batch_x = np.where(np.random.rand(12, 20, 20, 3) > 0.5, 1.0, -1.0)
batch_y = np.where(np.random.rand(12, 20, 20, 1) > 0.5, 1.0, 0.0)
prob = 0.5
with tf.Session() as session:
tf.set_random_seed(123)
session.run(tf.initialize_all_variables())
print "\n\n"
for i in range(10):
session.run(optimizer, feed_dict={x: batch_x, y: batch_y, p: prob})
print "step", i + 1
print "loss", session.run(loss, feed_dict={x: batch_x, y: batch_y, p: 1.0}), "\n\n"
Run Code Online (Sandbox Code Playgroud)
编辑29.11.17
一段时间后,我在TensorFlow 1.0中以干净的方式重新实现了它,前向操作也可以作为CPU版本使用.您可以在此分支中找到它,如果您想使用它,我建议您查找最后几次提交.
| 归档时间: |
|
| 查看次数: |
11244 次 |
| 最近记录: |