python - keras Tensorflow中InputLayer的输入形状是什么?

标签 python tensorflow deep-learning tf.keras

我有这个数据

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 的不同格式。

最佳答案

InputLayer实际上和指定参数 input_shape 是一样的在 Dense层。 Keras 实际上使用 InputLayer当您使用method 2时在后台。

# 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 。运行训练时,您会注意到在每个纪元下都显示 5/5用于5 batches您拥有的数据,因为训练大小是 150 , 150 / 32 = 5(rounded up) .

对于3D inputDense图层实际上只是被展平为 2D input ,即来自(batch_size, sequence_length, dim) -> (batch_size * sequence_length, dim) -> (batch_size, sequence_length, hidden_units)这与使用 Conv1D 相同图层 kernel1 。所以我什至不会使用Dense在本例中为层。

关于python - keras Tensorflow中InputLayer的输入形状是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68171716/

相关文章:

python - keras 层 Masking() 和 Embedding(mask_zero =True) 之间有区别吗?

python - 如何在 Tensorflow 中使用 tf.layers.dense 和 tf.data.Dataset 开发神经网络?

machine-learning - 如何在 Keras 中使用其他 GPU 和 TensorFlow 后端?

python - 用Python中的字典值替换正则表达式匹配组

javascript - 我们可以在 PUBNUB 中重新发布消息吗

python - 写入文件的方式与读取文件的方式相同

python - tensorflow 中具有权重衰减参数的 SGD

python - 邮件确认系统--如何将提交的邮件设置到signal中的recipient_list

python - 如何强制 tensorflow 和 Keras 在 GPU 上运行?

python - Keras 图像数据生成器 : how to use data augmentation with images paths