【问题标题】:What is the input shape of the InputLayer in keras Tensorflow?keras Tensorflow中InputLayer的输入形状是什么?
【发布时间】:2021-06-29 01:58:18
【问题描述】:

我有这个数据

X_regression = tf.range(0, 1000, 5)
y_regression = X + 100

X_reg_train, X_reg_test = X_regression[:150], X_regression[150:]
y_reg_train, y_reg_test = y_regression[:150], y_regression[150:]

我检查数据输入数据

X_reg_train[0], X_reg_train[0].shape, X_reg_train[0].ndim

然后它返回:

(<tf.Tensor: shape=(), dtype=int32, numpy=0>, TensorShape([]), 0)

我建立一个模型:

# Set the random seed
tf.random.set_seed(42)

# Create the model
model_reg = tf.keras.models.Sequential()

# Add Input layer
model_reg.add(tf.keras.layers.InputLayer(input_shape=[1]))

# Add Hidden layers
model_reg.add(tf.keras.layers.Dense(units=10, activation=tf.keras.activations.relu))

# Add last layer
model_reg.add(tf.keras.layers.Dense(units=1))

# Compile the model
model_reg.compile(optimizer=tf.keras.optimizers.Adam(),
                  loss=tf.keras.losses.mae,
                  metrics=[tf.keras.metrics.mae])

# Fit the model
model_reg.fit(X_reg_train, y_reg_train, epochs=10)

模型有效。

但是,我对input_shape感到困惑

为什么在这种情况下是[1]?为什么有时是元组?

不胜感激在不同情况下input_shape 的不同格式的解释。

【问题讨论】:

    标签: python tensorflow deep-learning tf.keras


    【解决方案1】:

    InputLayer 实际上与在Dense 层中指定参数input_shape 相同。当你在后台使用method 2 时,Keras 实际上使用了InputLayer

    # Method 1
    model_reg.add(tf.keras.layers.InputLayer(input_shape=(1,)))
    model_reg.add(tf.keras.layers.Dense(units=10, activation=tf.keras.activations.relu))
    
    # Method 2
    model_reg.add(tf.keras.layers.Dense(units=10, input_shape=(1,), activation=tf.keras.activations.relu))
    

    参数input_shape 实际上应该是一个元组,如果您注意到我在您的示例中将input_shape 设置为(1,),这是一个包含单个元素的元组。由于您的数据是一维数据,因此您一次传入一个元素,因此输入形状为 (1,)

    如果您的输入数据是二维输入,例如,当您尝试根据多个变量预测房屋价格时,您将拥有多行多列的数据。在这种情况下,您传入X_reg_train 的最后一个维度的输入形状,这是输入的数量。如果X_reg_train(1000,10),那么我们使用input_shape(10,)

    model_reg.add(tf.keras.layers.Dense(units=10, input_shape=(X_reg_train.shape[1],), activation=tf.keras.activations.relu))
    

    暂时忽略batch_size,我们实际上只是发送单行数据来预测单个房价。 batch_size 只是在这里将多行数据分块在一起,这样我们就不必将整个数据集加载到计算量很大的内存中,所以我们发送小块,默认值为32。运行训练时,您会注意到在每个 epoch 下,它会显示 5/5,这是您拥有的数据的 5 batches,因为训练大小为 150150 / 32 = 5(rounded up)

    对于带有Dense 层的3D input,它实际上只是扁平化为2D input,即从(batch_size, sequence_length, dim) -&gt; (batch_size * sequence_length, dim) -&gt; (batch_size, sequence_length, hidden_units),这与使用带有kernel1Conv1D 层相同。所以在这种情况下我什至不会使用Dense 层。

    【讨论】:

      【解决方案2】:

      在 Keras 中,输入层本身并不是一个层,而是一个张量。这是您发送到第一个隐藏层的起始张量。此张量必须与您的训练数据具有相同的形状。

      示例:如果您有 30 张 50x50 像素的 RGB 图像(3 个通道),则输入数据的形状为 (30,50,50,3)。那么你的输入层张量,必须有这个形状(详见“keras 中的形状”部分)。

      每种类型的层都需要具有一定维数的输入:

      • 密集层需要(batch_size, input_size)(batch_size, optional,...,optional, input_size) 的输入,或者在您的情况下只需(input_size)

      • 2D 卷积层需要输入为:

        • 如果使用 channels_last:(batch_size, imageside1, imageside2, channels)
        • 如果使用 channels_first:(batch_size, channels, imageside1, imageside2)
      • 一维卷积和循环层使用(batch_size, sequence_length, features)

      这里有一些有用的链接:Keras input explanation: input_shape, units, batch_size, dim, etchttps://keras.io/api/layers/core_layers/input/

      【讨论】:

      • 我理解你的例子,它很有帮助。但是,对于我的问题,输入数据没有形状,但我在测试 model_reg.add(tf.keras.layers.InputLayer(input_shape=()) 时看到错误
      • @AminBa 它的形状是(150,)[150] 尝试打印X_reg_train.shapeX_reg_train
      • @yudhiesh 输入是X_reg_train[0] 而不是X_reg_train。我正在一一发送数据。
      • 我刚刚检查过了。如果我使用 input_shape=(150,) ValueError: Input 0 of layer sequential_60 is incompatible with the layer: expected axis -1 of input shape to have value 150 but received input with shape (None, 1),我会看到一个错误
      猜你喜欢
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 2019-09-21
      • 2020-04-29
      • 1970-01-01
      • 2016-06-23
      相关资源
      最近更新 更多