张量操作是正确的吗?

时间:2019-02-05 21:54:52

标签: tensorflow keras

如果我执行以下操作:

r = (x - mn) / std

其中x的形状为(batchSize,100),mn和std均为长度(1,100)

减法和除法是按点完成的吗?我希望r为(batchSize,100)。

我无法直接检查形状,因为使用tf.keras.batch_flatten会使形状消失。

例如:

x.shape
TensorShape([Dimension(None), Dimension(314), Dimension(314), Dimension(8)])

x = K.batch_flatten(x)
<tf.Tensor 'conv2d_1/activity_regularizer/Reshape_2:0' shape=(?, ?) dtype=float32>

x.shape
TensorShape([Dimension(None), Dimension(None)])

1 个答案:

答案 0 :(得分:1)

KerasTensorflow有关的所有内容都与Numpy兼容。因此,让我们看一下。

x = np.array([1,2,3,4,5])
m = np.array([1,1,1,1,1])
n = np.array([5,4,3,2,1])
std = 10
m_times_n = m * n
# [5 4 3 2 1]
x_minus_mn = x - m_times_n
# [-4 -2  0  2  4]
r = x_minus_mn / std
# [-0.4 -0.2  0.   0.2  0.4]

所以它们是明智的。或者让我们看看Tensorflow中会发生什么:

tf.enable_eager_execution()
x = tf.constant([1,2,3,4,5])
m = tf.constant([1,1,1,1,1])
n = tf.constant([5,4,3,2,1])
std = tf.constant(10)
m_times_n = m * n
# tf.Tensor([5 4 3 2 1], shape=(5,), dtype=int32)
x_minus_mn = x - m_times_n
# tf.Tensor([-4 -2  0  2  4], shape=(5,), dtype=int32)
r = x_minus_mn / std
# tf.Tensor([-0.4 -0.2  0.   0.2  0.4], shape=(5,), dtype=float64)

也是如此。


在您的帖子中,您还提到tf.keras.batch_flatten存在问题。产生的(?, ?)形状是由于tf.keras.batch_flatten的工作方式引起的。让我们看一下:

# Assuming we have 5 images, with 320x320 size, and 3 channels
X = tf.ones((5, 320,320, 3))
flatten = tf.keras.backend.batch_flatten(X)
flatten.shape
# (5, 307200)

摘自文档:

  

将nD张量转换为第0维相同的2D张量。

我们正在看到确切的东西。 0th (batch_size)保持不变,而所有其他尺寸都受到挤压,从而使张量为2D。