张量流展平方法之间的区别

时间:2018-10-19 18:10:29

标签: python python-3.x tensorflow

我遇到了两种平整卷积池的方法,但是我不明白为什么这两种方法都行得通。第一种方法对我来说很直接,从tensorflow example使用:

"Places" : {
"-LOfa80NgfgmuZ4Bs0sh" : {
  "date" : "SELECT DATE",
  "district" : "District",
  "image" : "https://firebasestorage.googleapis.com/",
  "name" : "abcd",
  "place" : "",
},

但是,我使用以下代码遇到了另一个代码:

在这里,pool2 = tf.reshape(pool2, [-1, 7 * 7 * 64]) 来自卷积层。

conv2

然后都传递给

pool2 = tf.squeeze(tf.reduce_max(conv2, 1), squeeze_dims=[1])

其中最后一个logits = tf.layers.dense(inputs=pool2, units=MAX_LABEL, activation=None) 用于计算logits

entropy

1 个答案:

答案 0 :(得分:1)

两个示例中conv2张量的形状都相同吗? 我认为第二个已经重塑了张量。

在张量流示例中conv2的形状为(batch, y, x, filters),而第二个形状为(batch, y*x, 1, filters),因此以下代码可以正常工作。

如果conv2的大小与pool_size相同(在这种情况下为2x2),则这两种方法具有相同的输出,每个过滤器将仅输出一个值,这是 与reduce_max完全相同。

例如:

import tensorflow as tf
'The same input, but different shape' 
random_tensor = np.random.random([16,2,2,64])
method1_input=tf.constant(random_tensor)             # shape = (16,2,2,64)
method2_input=tf.reshape(method1_input,[16,4,1,64])  # shape = (16,4,1,64)
'method 1 : maxpool'
maxpool      = tf.layers.max_pooling2d(inputs=method1_input, pool_size=[2, 2], strides=2)
maxpool_flat = tf.reshape(maxpool, [-1,64])

'method 2 : reduce_max and squeeze'
red_max = tf.reduce_max(method2_input, 1)   # shape = (16,1,64)
pool2   = tf.squeeze(red_max, squeeze_dims=[1])  # shape = (16,64)  ,literally squeeze dim [1]

with tf.Session() as sess :
    method1_result=(sess.run(maxpool_flat) )
    method2_result=(sess.run(pool2) )
    Is_true = sess.run(tf.equal(method1_result,method2_result)  )
    print(Is_true)
    # output
    #[[ True  True  True ...  True  True  True]
    # [ True  True  True ...  True  True  True]
    # [ True  True  True ...  True  True  True]
    # ...
    # [ True  True  True ...  True  True  True]
    # [ True  True  True ...  True  True  True]
    # [ True  True  True ...  True  True  True]]