keras Tensorflow 中 InputLayer 的输入形状是什么?
What is the input shape of the InputLayer in keras Tensorflow?
我有这个数据
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
它 returns:
(<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
在不同情况下的不同格式的解释。
在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)
这里有一些有用的链接: https://keras.io/api/layers/core_layers/input/
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)
那么我们使用 (10,)
的 input_shape
。
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 input
和 Dense
层,它实际上只是被压扁为 2D input
,即从 (batch_size, sequence_length, dim) -> (batch_size * sequence_length, dim) -> (batch_size, sequence_length, hidden_units)
开始,这与使用 Conv1D
层 kernel
为 1
。所以在这种情况下我什至不会使用 Dense
层。
我有这个数据
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
它 returns:
(<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
在不同情况下的不同格式的解释。
在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)
- 如果使用 channels_last:
一维卷积和循环层使用
(batch_size, sequence_length, features)
这里有一些有用的链接:
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)
那么我们使用 (10,)
的 input_shape
。
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 input
和 Dense
层,它实际上只是被压扁为 2D input
,即从 (batch_size, sequence_length, dim) -> (batch_size * sequence_length, dim) -> (batch_size, sequence_length, hidden_units)
开始,这与使用 Conv1D
层 kernel
为 1
。所以在这种情况下我什至不会使用 Dense
层。