【问题标题】:Why do you have to reshape inputs in Keras/Tensorflow 2?为什么你必须重塑 Keras/Tensorflow 2 中的输入?
【发布时间】:2020-03-25 16:45:35
【问题描述】:

我有一个简单的网络:

input_layer = Input(1)
inner_layer = Dense(4, activation='relu')(input_layer)
output_layer = Dense(1, activation='linear')(inner_layer)
model = Model(input_layer, output_layer)
optimizer = Adam(learning_rate=0.01)
model.compile(optimizer=optimizer, loss='mse')

直观地说,输入0 的推断将只是model.predict(0)。然而这会产生这个错误:expected input_2 to have 2 dimensions, but got array with shape ()

我知道它期望输入(单个数字)是二维的,但我不明白 Tensorflow 接受什么作为有效输入。我尝试了许多不同的输入组合,有些有效,有些无效,看起来很不一致,警告/错误通常没有用:

拨打model.predict()时:

  • model.predict(0) - 抛出
  • model.predict([0]) - 工作
  • model.predict([[0]]) - 工作

当调用model() 时(我看到here 需要获取渐变):

  • model(0) - 抛出
  • model([0]) - 抛出
  • model([[0]]) - 抛出

使用np.reshape时:

  • model(np.reshape(0,[1,1])) - 工作
  • model(np.reshape([0],[1,1])) - 工作
  • model(np.reshape([[0]],[1,1])) - 工作

似乎一直在使用 numpy 的 reshape 函数。只要将它们重新整形为[1,1] 形状,它就始终适用于所有输入的model.predict()model()

我的问题:

  1. 在输入形状/类型方面,将输入输入到 TensorFlow 模型中的准则是什么?
  2. shape ()”是什么意思?
  3. (None, 1)”是什么意思?
  4. 为什么reshape 有效而[[0]] 无效?两者都创建了一个二维集合。
  5. 为什么在调用model(0)/model([0])/model([[0]]) 时会显示此警告:WARNING:tensorflow:Model was constructed with shape Tensor("input_1:0", shape=(None, 1), dtype=float32) for input (None, 1), but it was re-called on a Tensor with incompatible shape ()

【问题讨论】:

    标签: python numpy tensorflow keras


    【解决方案1】:

    张量inputs = tf.keras.layers.Input(1) 的形状是(None, 1)(运行inputs.get_shape().as_list())。 None 表示动态确定的任何大小(批量大小)。 1 是数据点的形状。例如,这是一个形状为(3, 1)的张量:

    [[1], [2], [1]]
    

    这是一个形状为(3,)的张量

    [1, 2, 1]
    

    如果你定义一个形状为(None, 1) 的张量,你必须输入相同形状的数据。

    [[0]] 具有正确的形状 (1, 1),如果您将其作为预期数据类型的 numpy 数组传递,则不会引发任何错误或警告:

    import tensorflow as tf
    import numpy as np
    
    input_layer = tf.keras.layers.Input(1)
    inner_layer = tf.keras.layers.Dense(4, activation='relu')(input_layer)
    output_layer = tf.keras.layers.Dense(1, activation='linear')(inner_layer)
    model = tf.keras.models.Model(input_layer, output_layer)
    optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)
    model.compile(optimizer=optimizer, loss='mse')
    print(model(np.array([[0.]], dtype=np.float32)).numpy()) # [[0.]]
    print(model.predict(np.array([[0.], [1]], dtype=np.float32))) # [[0.        ]
                                                                  # [0.08964952]]
    

    np.reshape() 有效,因为它会自动将您的列表转换为 numpy 数组。有关np.reshape 的更多信息,请参阅official documentation

    model.predict() 也需要与model.__call__() 相同的形状,但可以执行自动整形(扩展左侧的尺寸,即[1] -- > [[1]])。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-20
      • 2021-05-15
      • 2017-07-30
      • 2019-02-10
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多