在Tensorflow中实现没有展平图层的模型

时间:2017-11-02 09:06:03

标签: machine-learning tensorflow neural-network computer-vision conv-neural-network

使用CNN的典型方法包括卷积部分和完全连接的层部分,它们与平坦层连接。该层转换conv的输出。部分(形状(x, y, z))成为一维特征向量,该向量过去到由完全连接的层组成的分类器。

我的问题是在图像中找到一个像素,它是某个物体的中心,而整个图像的拓扑/纹理导致了这一点。所以我想要一个没有展平图层的模型,而FC部分则从conv的输出中获取单独的向量。部分和FC层的输出是到这个感兴趣的像素的距离(我认为这些单独的特征向量携带这个信息)。这个想法很简单,但如何训练呢?我想知道这是否可以在tensorflow(或任何其他框架)中以某种方式实现?

另一个选项是具有展平图层的典型模型。 FC部分将从conv获取整个输出。部分(整个特征图),它将预测所需像素的位置。你认为这两种变体是等价的吗?它非常棒,因为第二个选项很容易在任何框架中实现。

1 个答案:

答案 0 :(得分:0)

这听起来像是一个分割问题,唯一的区别是通常的模型会预测边界框(4个浮动值),而你希望预测单个值(如果你的意思是距离 )。但它在代码方面并不重要,因为它只是用回归头替换分类头。你描述的两种方法似乎都是一样的。

这是tensorflow中的示例代码:

# Assume:
#   layer.shape = (?, 16, 16, 64)   <- last CNV layer output
#   y.shape = (?, 1)                <- target distance

# FC layer params: will output (?, 128)
w_fc = tf.Variable(tf.random_normal([16 * 16 * 64, 128]))
b_fc = tf.Variable(tf.random_normal([128]))

# Output layer params: will output (?, 1)
w_out = tf.Variable(tf.random_normal([128, 1]))
b_out = tf.Variable(tf.random_normal([1]))

# Reshape to make applicable to the FC layer
reshaped = tf.reshape(layer, [-1, w_fc.get_shape().as_list()[0]])
fc = tf.add(tf.matmul(reshaped, w_fc), b_fc)
fc = tf.nn.relu(fc)
out = tf.add(tf.matmul(fc, w_out), b_out)

# Standard L2 loss
loss = tf.reduce_mean(tf.nn.l2_loss(out - y))
optimizer = tf.train.AdamOptimizer(learning_rate=0.01).minimize(loss)