我遇到了两种平整卷积池的方法,但是我不明白为什么这两种方法都行得通。第一种方法对我来说很直接,从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
答案 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]]