keras.layers.Input()输入层解析

发布时间 2023-10-08 09:35:43作者: emanlee

 

Input()参数解析


layers.Input(
    shape=None,
    batch_size=None,
    name=None,
    dtype=None,
    sparse=False,
    tensor=None,
    ragged=False,
    **kwargs,
)

Returns:
  A tensor.

 
参数:
shape: 函数的输入形状,数据的形式为元组(元组参数要为int型),不包含batch大小的那个维度。如果有某个维度的信息不知道,则可以表示为None
batch_size: 一个可选的参数(整数类型),用来声明网络训练batch的大小
name: 给你的这层网络创建一个名字,名字应该在你的所有网络层中是不重复的,默认参数为None,系统会自动取名字。
dtype: 你输入的具体的数据的类型。有很多可选的参数,一般情况下我们选择 tf.float32 的类型,因为在精度满足的情况下,float32运算更快。
sparse: 指定要创建的占位符是否为稀疏的布尔值。 “参差的”和“稀疏的”中只有一个是真的。 请注意,如果sparse为False,稀疏张量仍然可以被传递到输入中——它们将被致密化为默认值0。
tensor: 一个可选的参数,将现有张量包装到输入层。如果设置了,图层将对这个张量使用 tf.TypeSpec。 而不是创建一个新的占位符张量。
ragged: 一个布尔值,指定要创建的占位符是否不规则。 “参差的”和“稀疏的”中只有一个是真的。 在本例中,“shape”参数中的“None”值表示不规则的尺寸。
type_spec: 用来创建输入占位符的TypeSpec对象。 当提供时,除了name之外的所有其他参数都必须为None。
**kwargs: 弃用参数支持。 支持batch_shape和batch_input_shape。也就是通过这个参数,之前的参数也能使用关键字使用。

Returns: .一个tensor张量


为什么要有这个input层



首先、 我们的第一层也就是输入层也是网络的一部分,也是需要各种参数的。如name、shape等等,把其当作网络的一层,就很好理解为什么了,因为我们自己建立的网络没有对输入端口进行一些初始化。

其次、 直接建立的普通的tensor张量,没有外加的一些属性,如
1)._keras_shape: 整型的形状元组通过keras-side 形状推理传播

2)._keras_history: 最后一层应用于张量,整个图层的图可以从那个层,递归地检索出来。
这些外加的属性,使我们通过知道模型的输入和输出来构建keras模型。

 

用于构建网络的第一层——输入层,该层会告诉网络我们的输入的尺寸是什么,这一点很重要。例如使用Model(input=x,output=y)构建网络,这种构建方式很常见,用途很广.

 

一个例子



from tensorflow.keras.layers import Input,Dense
from tensorflow.keras.models import Model

x = Input(shape=(32,))
y = Dense(16, activation='softmax')(x)
model = Model(x, y)



链接:https://blog.csdn.net/To_be_little/article/details/123710537

 

其他

 

在构建神经网络中,一定要注意shape的大小,如果报错在shape上是一件很头疼的事情,所以写一部分测试一下是一个良好的编程习惯。

通常建议通过 Input 使用 Keras 函数模型(创建 InputLayer )而不直接使用 InputLayer

InputLayer 与 Keras Sequential 模型一起使用时,可以通过将 input_shape 参数移动到 InputLayer 之后的第一层来跳过它。

 

from tensorflow import keras
from tensorflow.keras import layers

inputs = keras.Input(shape = (28, 28, 1)) ## 手写数字识别, 高*宽*通道  shape->image_height, image_width, image_channels;  input_4 (InputLayer) [(None, 28, 28, 1)] 
x = layers.Conv2D(filters = 32, kernel_size=3, activation='relu')(inputs)
x = layers.MaxPooling2D(pool_size=2)(x)
x = layers.Conv2D(filters=64, kernel_size=3, activation='relu')(x)
x = layers.MaxPooling2D(pool_size=2)(x)
x = layers.Conv2D(filters=128, kernel_size=3, activation='relu')(x)
x = layers.Flatten()(x)
outputs = layers.Dense(10, activation='softmax')(x)
model = keras.Model(inputs=inputs, outputs=outputs)

 

 

# With explicit InputLayer.
model = tf.keras.Sequential([
  tf.keras.layers.InputLayer(input_shape=(4,)),
  tf.keras.layers.Dense(8)])
model.compile(tf.optimizers.RMSprop(0.001), loss='mse')
model.fit(np.zeros((10, 4)),
          np.ones((10, 8)))

# Without InputLayer and let the first layer to have the input_shape.
# Keras will add a input for the model behind the scene.
model = tf.keras.Sequential([
  tf.keras.layers.Dense(8, input_shape=(4,))])
model.compile(tf.optimizers.RMSprop(0.001), loss='mse')
model.fit(np.zeros((10, 4)),
          np.ones((10, 8)))

 

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,)这是一个元组,其中只有一个元素。由于您的数据是1D,因此每次传入一个元素,因此输入形状是(1,)

如果您的输入数据是2D输入(例如,在尝试基于多个变量预测房价时),那么您将拥有多行多列的数据。在本例中,传入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。在运行训练时,您可能会注意到,在每个epoch下,它都会显示5/5,这表示您拥有的5 batches数据,因为训练大小是150150 / 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层。

 

 


REF

https://blog.csdn.net/weixin_44441131/article/details/105892591

https://blog.csdn.net/weixin_44441131/article/details/105905536

https://www.5axxw.com/questions/content/uhzy0n