在Keras中,层(Layer)是构建神经网络的基本组件。Keras提供了多种类型的层,用于处理不同类型的输入数据和执行特定的数学操作。
英文版可参考TensorFlow官方文档:Module: tf.keras.layers | TensorFlow v2.16.1
用于执行全连接操作;
Conv1D、Conv2D、Conv3D层,用于执行一维、二维、三维卷积操作;
如MaxPooling1D、MaxPooling2D、MaxPooling3D,用于执行最大值池化;以及Flatten层,用于将多维输入展平为一维输出。
如Activation层,用于应用各种激活函数,如ReLU、Sigmoid等,以增加模型的非线性。
如ActivityRegularization层,用于在训练过程中基于激活值更新损失函数值,以防止过拟合。
Embedding层,用于将正整数(下标)转换为具有固定大小的向量,常见于处理文本数据或类别数据。
如SimpleRNN、LSTM、GRU层,适用于处理序列数据。
1) Cropping层,用于在特定维度上裁剪输入;
2) ZeroPadding层,用于在输入的边界添加零以改变尺寸;以及LocallyConnected层,类似于卷积层但不共享权值。
通过定义自定义层,可以实现更复杂的数学操作或特定任务所需的逻辑。例如,可以通过定义Lambda层来实现任意数学表达式。
这些层的组合和堆叠可以构建出功能强大的神经网络模型,用于解决各种机器学习任务
layer.get_weights() #返回该层的权重(numpy array)
layer.set_weights(weights)#将权重加载到该层
config = layer.get_config()#保存该层的配置
layer = layer_from_config(config)#加载一个配置到该层
#如果层仅有一个计算节点(即该层不是共享层),则可以通过下列方法获得输入张量、输出张量、输入数据的形状和输出数据的形状:
layer.input
layer.output
layer.input_shape
layer.output_shape
#如果该层有多个计算节点。可以使用下面的方法
layer.get_input_at(node_index)
layer.get_output_at(node_index)
layer.get_input_shape_at(node_index)
layer.get_output_shape_at(node_index)
keras.layers.core.Dense(units,activation=None,use_bias=True,kernel_initializer='glorot_uniform',bias_initializer='zeros',kernel_regularizer=None,bias_regularizer=None,activity_regularizer=None,kernel_constraint=None,bias_constraint=None)
参数:
keras.layers.core.Activation(activation)
激活层对一个层的输出施加激活函数
参数:
输入shape:任意,当使用激活层作为第一层时,要指定input_shape
输出shape:与输入shape相同
keras.layers.core.Dropout(rate, noise_shape=None, seed=None)
为输入数据施加Dropout。Dropout将在训练过程中每次更新参数时按一定概率(rate)随机断开输入神经元,Dropout层用于防止过拟合。
参数
keras.layers.core.Flatten()
Flatten层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡。Flatten不影响batch的大小。
demo:
model = Sequential()
model.add(Convolution2D(64, 3, 3,
border_mode='same',
input_shape=(3, 32, 32)))
# now: model.output_shape == (None, 64, 32, 32)
model.add(Flatten())
# now: model.output_shape == (None, 65536)
keras.layers.core.Reshape(target_shape)
Reshape层用来将输入shape转换为特定的shape
参数
输入shape:任意,但输入的shape必须固定。当使用该层为模型首层时,需要指定input_shape参数
输出shape:(batch_size,)+target_shape
demo:
# as first layer in a Sequential model
model = Sequential()
model.add(Reshape((3, 4), input_shape=(12,)))
# now: model.output_shape == (None, 3, 4)
# note: `None` is the batch dimension
# as intermediate layer in a Sequential model
model.add(Reshape((6, 2)))
# now: model.output_shape == (None, 6, 2)
# also supports shape inference using `-1` as dimension
model.add(Reshape((-1, 2, 2)))
# now: model.output_shape == (None, 3, 2, 2)
keras.layers.core.Permute(dims)
Permute层将输入的维度按照给定模式进行重排,例如,当需要将RNN和CNN网络连接时,可能会用到该层。所谓的重排也就是交换两行
参数
model = Sequential()
model.add(Permute((2, 1), input_shape=(10, 64)))
# now: model.output_shape == (None, 64, 10)
# note: `None` is the batch dimension
输入shape:任意,当使用激活层作为第一层时,要指定input_shape
输出shape:与输入相同,但是其维度按照指定的模式重新排列
keras.layers.core.RepeatVector(n)
RepeatVector层将输入重复n次
参数
输入shape:形如(nb_samples, features)的2D张量
输出shape:形如(nb_samples, n, features)的3D张量
例子
model = Sequential()
model.add(Dense(32, input_dim=32))
# now: model.output_shape == (None, 32)
# note: `None` is the batch dimension
model.add(RepeatVector(3))
# now: model.output_shape == (None, 3, 32)
keras.layers.core.Lambda(function, output_shape=None, mask=None, arguments=None)
本函数用以对上一层的输出施以任何Theano/TensorFlow表达式
参数
输入shape:任意,当使用该层作为第一层时,要指定input_shape
输出shape:由output_shape参数指定的输出shape,当使用tensorflow时可自动推断
# add a x -> x^2 layer
model.add(Lambda(lambda x: x ** 2))
# add a layer that returns the concatenation
# of the positive part of the input and
# the opposite of the negative part
def antirectifier(x):
x -= K.mean(x, axis=1, keepdims=True)
x = K.l2_normalize(x, axis=1)
pos = K.relu(x)
neg = K.relu(-x)
return K.concatenate([pos, neg], axis=1)
def antirectifier_output_shape(input_shape):
shape = list(input_shape)
assert len(shape) == 2 # only valid for 2D tensors
shape[-1] *= 2
return tuple(shape)
model.add(Lambda(antirectifier,
output_shape=antirectifier_output_shape))
9. ActivityRegularizer层
keras.layers.core.ActivityRegularization(l1=0.0, l2=0.0)
经过本层的数据不会有任何变化,但会基于其激活值更新损失函数值
参数
输入shape:任意,当使用该层作为第一层时,要指定input_shape
输出shape:与输入shape相同
keras.layers.core.Masking(mask_value=0.0)
keras.layers.convolutional.Conv1D(filters, kernel_size, strides=1, padding='valid', dilation_rate=1, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
一维卷积层(即时域卷积),用以在一维输入信号上进行邻域滤波。当使用该层作为首层时,需要提供关键字参数input_shape。例如(10,128)代表一个长为10的序列,序列中每个信号为128向量。而(None, 128)代表变长的128维向量序列。
该层生成将输入信号与卷积核按照单一的空域(或时域)方向进行卷积。如果use_bias=True,则还会加上一个偏置项,若activation不为None,则输出为经过激活函数的输出。
参数
输入shape:形如(samples,steps,input_dim)的3D张量
输出shape:形如(samples,new_steps,nb_filter)的3D张量,因为有向量填充的原因,steps的值会改变
【Tips】可以将Convolution1D看作Convolution2D的快捷版,对例子中(10,32)的信号进行1D卷积相当于对其进行卷积核为(filter_length, 32)的2D卷积。
keras.layers.convolutional.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, dilation_rate=(1, 1), activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
二维卷积层,即对图像的空域卷积。该层对二维输入进行滑动窗卷积,当使用该层作为第一层时,应提供input_shape
参数。例如input_shape = (128,128,3)
代表128*128的彩色RGB图像(data_format='channels_last'
)
参数
输入shape:
‘channels_first’模式下,输入形如(samples,channels,rows,cols)的4D张量。
‘channels_last’模式下,输入形如(samples,rows,cols,channels)的4D张量。
注意这里的输入shape指的是函数内部实现的输入shape,而非函数接口应指定的input_shape,请参考下面提供的例子。
输出shape:
‘channels_first’模式下,为形如(samples,nb_filter, new_rows, new_cols)的4D张量。
‘channels_last’模式下,为形如(samples,new_rows, new_cols,nb_filter)的4D张。量
输出的行列数可能会因为填充方法而改变。
keras.layers.convolutional.SeparableConv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, depth_multiplier=1, activation=None, use_bias=True, depthwise_initializer='glorot_uniform', pointwise_initializer='glorot_uniform', bias_initializer='zeros', depthwise_regularizer=None, pointwise_regularizer=None, bias_regularizer=None, activity_regularizer=None, depthwise_constraint=None, pointwise_constraint=None, bias_constraint=None)
该层是在深度方向上的可分离卷积。
可分离卷积首先按深度方向进行卷积(对每个输入通道分别卷积),然后逐点进行卷积,将上一步的卷积结果混合到输出通道中。参数depth_multiplier控制了在depthwise卷积(第一步)的过程中,每个输入通道信号产生多少个输出通道。
直观来说,可分离卷积可以看做讲一个卷积核分解为两个小的卷积核,或看作Inception模块的一种极端情况。
当使用该层作为第一层时,应提供input_shape参数。例如input_shape = (3,128,128)代表128*128的彩色RGB图像。
参数
输入shape
‘channels_first’模式下,输入形如(samples,channels,rows,cols)的4D张量。
‘channels_last’模式下,输入形如(samples,rows,cols,channels)的4D张量。
注意这里的输入shape指的是函数内部实现的输入shape,而非函数接口应指定的input_shape,请参考下面提供的例子。
输出shape
‘channels_first’模式下,为形如(samples,nb_filter, new_rows, new_cols)的4D张量。
‘channels_last’模式下,为形如(samples,new_rows, new_cols,nb_filter)的4D张量。
输出的行列数可能会因为填充方法而改变
keras.layers.convolutional.Conv2DTranspose(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
该层是转置的卷积操作(反卷积)。需要反卷积的情况通常发生在用户想要对一个普通卷积的结果做反方向的变换。例如,将具有该卷积层输出shape的tensor转换为具有该卷积层输入shape的tensor。同时保留与卷积层兼容的连接模式。
当使用该层作为第一层时,应提供input_shape参数。例如input_shape = (3,128,128)代表128*128的彩色RGB图像。
参数
输入shape
‘channels_first’模式下,输入形如(samples,channels,rows,cols)的4D张量。
‘channels_last’模式下,输入形如(samples,rows,cols,channels)的4D张量。
注意这里的输入shape指的是函数内部实现的输入shape,而非函数接口应指定的input_shape,请参考下面提供的例子。
输出shape
‘channels_first’模式下,为形如(samples,nb_filter, new_rows, new_cols)的4D张量。
‘channels_last’模式下,为形如(samples,new_rows, new_cols,nb_filter)的4D张量。
输出的行列数可能会因为填充方法而改变
keras.layers.convolutional.Conv3D(filters, kernel_size, strides=(1, 1, 1), padding='valid', data_format=None, dilation_rate=(1, 1, 1), activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
三维卷积对三维的输入进行滑动窗卷积,当使用该层作为第一层时,应提供input_shape参数。例如input_shape = (3,10,128,128)代表对10帧128*128的彩色RGB图像进行卷积。数据的通道位置仍然有data_format参数指定。
参数
输入shape
‘channels_first’模式下,输入应为形如(samples,channels,input_dim1,input_dim2, input_dim3)的5D张量
‘channels_last’模式下,输入应为形如(samples,input_dim1,input_dim2, input_dim3,channels)的5D张量
这里的输入shape指的是函数内部实现的输入shape,而非函数接口应指定的input_shape。
keras.layers.convolutional.Cropping1D(cropping=(1, 1))
在时间轴(axis1)上对1D输入(即时间序列)进行裁剪
参数
输入shape:形如(samples,axis_to_crop,features)的3D张量
输出shape:形如(samples,cropped_axis,features)的3D张量。
keras.layers.convolutional.Cropping2D(cropping=((0, 0), (0, 0)), data_format=None)
对2D输入(图像)进行裁剪,将在空域维度,即宽和高的方向上裁剪
参数
输入shape:形如(samples,depth, first_axis_to_crop, second_axis_to_crop)
输出shape:形如(samples, depth, first_cropped_axis, second_cropped_axis)的4D张量。
keras.layers.convolutional.Cropping3D(cropping=((1, 1), (1, 1), (1, 1)), data_format=None)
对2D输入(图像)进行裁剪
参数
输入shape:形如 (samples, depth, first_axis_to_crop, second_axis_to_crop, third_axis_to_crop)的5D张量。
输出shape:形如(samples, depth, first_cropped_axis, second_cropped_axis, third_cropped_axis)的5D张量。
keras.layers.convolutional.UpSampling1D(size=2)
在时间轴上,将每个时间步重复length次
参数
输入shape:形如(samples,steps,features)的3D张量
输出shape:形如(samples,upsampled_steps,features)的3D张量
keras.layers.convolutional.UpSampling2D(size=(2, 2), data_format=None)
将数据的行和列分别重复size[0]和size[1]次
参数
size:整数tuple,分别为行和列上采样因子
data_format:字符串,“channels_first”或“channels_last”之一,代表图像的通道维的位置。该参数是Keras 1.x中的image_dim_ordering,“channels_last”对应原本的“tf”,“channels_first”对应原本的“th”。以128x128的RGB图像为例,“channels_first”应将数据组织为(3,128,128),而“channels_last”应将数据组织为(128,128,3)。该参数的默认值是~/.keras/keras.json中设置的值,若从未设置过,则为“channels_last”。
输入shape:
‘channels_first’模式下,为形如(samples,channels, rows,cols)的4D张量。
‘channels_last’模式下,为形如(samples,rows, cols,channels)的4D张量。
输出shape:
‘channels_first’模式下,为形如(samples,channels, upsampled_rows, upsampled_cols)的4D张量。
‘channels_last’模式下,为形如(samples,upsampled_rows, upsampled_cols,channels)的4D张量。
keras.layers.convolutional.UpSampling3D(size=(2, 2, 2), data_format=None)
将数据的三个维度上分别重复size[0]、size[1]和ize[2]次
本层目前只能在使用Theano为后端时可用
参数
输入shape:
‘channels_first’模式下,为形如(samples, channels, len_pool_dim1, len_pool_dim2, len_pool_dim3)的5D张量
‘channels_last’模式下,为形如(samples, len_pool_dim1, len_pool_dim2, len_pool_dim3,channels, )的5D张量
输出shape:
‘channels_first’模式下,为形如(samples, channels, dim1, dim2, dim3)的5D张量
‘channels_last’模式下,为形如(samples, upsampled_dim1, upsampled_dim2, upsampled_dim3,channels,)的5D张量。
keras.layers.convolutional.ZeroPadding1D(padding=1)
对1D输入的首尾端(如时域序列)填充0,以控制卷积以后向量的长度
参数
输入shape:形如(samples,axis_to_pad,features)的3D张量
输出shape:形如(samples,paded_axis,features)的3D张量
keras.layers.convolutional.ZeroPadding2D(padding=(1, 1), data_format=None)
对2D输入(如图片)的边界填充0,以控制卷积以后特征图的大小
参数
输入shape:
‘channels_first’模式下,形如(samples,channels,first_axis_to_pad,second_axis_to_pad)的4D张量。
‘channels_last’模式下,形如(samples,first_axis_to_pad,second_axis_to_pad, channels)的4D张量。
输出shape:
‘channels_first’模式下,形如(samples,channels,first_paded_axis,second_paded_axis)的4D张量
‘channels_last’模式下,形如(samples,first_paded_axis,second_paded_axis, channels)的4D张量
keras.layers.convolutional.ZeroPadding3D(padding=(1, 1, 1), data_format=None)
将数据的三个维度上填充0
本层目前只能在使用Theano为后端时可用
参数
输入shape:
‘channels_first’模式下,为形如(samples, channels, first_axis_to_pad,first_axis_to_pad, first_axis_to_pad,)的5D张量。
‘channels_last’模式下,为形如(samples, first_axis_to_pad,first_axis_to_pad, first_axis_to_pad, channels)的5D张量。
输出shape:
‘channels_first’模式下,为形如(samples, channels, first_paded_axis,second_paded_axis, third_paded_axis,)的5D张量
‘channels_last’模式下,为形如(samples, len_pool_dim1, len_pool_dim2, len_pool_dim3,channels, )的5D张量
keras.layers.pooling.MaxPooling1D(pool_size=2, strides=None, padding='valid')
对时域1D信号进行最大值池化
参数
输入shape:形如(samples,steps,features)的3D张量
输出shape:形如(samples,downsampled_steps,features)的3D张量
keras.layers.pooling.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)
为空域信号施加最大值池化
参数
输入shape
‘channels_first’模式下,为形如(samples,channels, rows,cols)的4D张量
‘channels_last’模式下,为形如(samples,rows, cols,channels)的4D张量
输出shape
‘channels_first’模式下,为形如(samples,channels, pooled_rows, pooled_cols)的4D张量
‘channels_last’模式下,为形如(samples,pooled_rows, pooled_cols,channels)的4D张量
keras.layers.pooling.MaxPooling3D(pool_size=(2, 2, 2), strides=None, padding='valid', data_format=None)
为3D信号(空域或时空域)施加最大值池化。本层目前只能在使用Theano为后端时可用
参数
输入shape
‘channels_first’模式下,为形如(samples, channels, len_pool_dim1, len_pool_dim2, len_pool_dim3)的5D张量
‘channels_last’模式下,为形如(samples, len_pool_dim1, len_pool_dim2, len_pool_dim3,channels, )的5D张量
输出shape
‘channels_first’模式下,为形如(samples, channels, pooled_dim1, pooled_dim2, pooled_dim3)的5D张量
‘channels_last’模式下,为形如(samples, pooled_dim1, pooled_dim2, pooled_dim3,channels,)的5D张量
keras.layers.pooling.AveragePooling1D(pool_size=2, strides=None, padding='valid')
对时域1D信号进行平均值池化
参数
输入shape:形如(samples,steps,features)的3D张量
输出shape:形如(samples,downsampled_steps,features)的3D张量
keras.layers.pooling.AveragePooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)
为空域信号施加平均值池化
参数
输入shape
‘channels_first’模式下,为形如(samples,channels, rows,cols)的4D张量。
‘channels_last’模式下,为形如(samples,rows, cols,channels)的4D张量。
输出shape
‘channels_first’模式下,为形如(samples,channels, pooled_rows, pooled_cols)的4D张量。
‘channels_last’模式下,为形如(samples,pooled_rows, pooled_cols,channels)的4D张量。
keras.layers.pooling.AveragePooling3D(pool_size=(2, 2, 2), strides=None, padding='valid', data_format=None)
为3D信号(空域或时空域)施加平均值池化。本层目前只能在使用Theano为后端时可用
参数
输入shape:
‘channels_first’模式下,为形如(samples, channels, len_pool_dim1, len_pool_dim2, len_pool_dim3)的5D张量
‘channels_last’模式下,为形如(samples, len_pool_dim1, len_pool_dim2, len_pool_dim3,channels, )的5D张量
输出shape:
‘channels_first’模式下,为形如(samples, channels, pooled_dim1, pooled_dim2, pooled_dim3)的5D张量
‘channels_last’模式下,为形如(samples, pooled_dim1, pooled_dim2, pooled_dim3,channels,)的5D张量
keras.layers.pooling.GlobalMaxPooling1D()
对于时间信号的全局最大池化
输入shape:形如(samples,steps,features)的3D张量。
输出shape:形如(samples, features)的2D张量。
keras.layers.pooling.GlobalAveragePooling1D()
为时域信号施加全局平均值池化
输入shape:形如(samples,steps,features)的3D张量
输出shape:形如(samples, features)的2D张量
keras.layers.pooling.GlobalMaxPooling2D(dim_ordering='default')
为空域信号施加全局最大值池化
参数
输入shape:
‘channels_first’模式下,为形如(samples,channels, rows,cols)的4D张量
‘channels_last’模式下,为形如(samples,rows, cols,channels)的4D张量
输出shape:形如(nb_samples, channels)的2D张量
keras.layers.pooling.GlobalAveragePooling2D(dim_ordering='default')
为空域信号施加全局平均值池化
参数
输入shape:
‘channels_first’模式下,为形如(samples,channels, rows,cols)的4D张量
‘channels_last’模式下,为形如(samples,rows, cols,channels)的4D张量
输出shape:形如(nb_samples, channels)的2D张量
递归层包含三种模型:LSTM、GRU和SimpleRNN
keras.layers.recurrent.Recurrent(weights=None, return_sequences=False, go_backwards=False, stateful=False, unroll=False, consume_less='cpu', input_dim=None, input_length=None)
return_sequences:True返回整个序列,false返回输出序列的最后一个输出
go_backwards:True,逆向处理输入序列,默认为False
stateful:布尔值,默认为False,若为True,则一个batch中下标为i的样本的最终状态将会用作下一个batch同样下标的样本的初始状态
keras.layers.recurrent.SimpleRNN(output_dim, init='glorot_uniform', inner_init='orthogonal', activation='tanh', W_regularizer=None, U_regularizer=None, b_regularizer=None, dropout_W=0.0, dropout_U=0.0)
inner_init:内部单元的初始化方法
dropout_W:0~1之间的浮点数,控制输入单元到输入门的连接断开比例
dropout_U:0~1之间的浮点数,控制输入单元到递归连接的断开比例
keras.layers.recurrent.LSTM(output_dim, init='glorot_uniform', inner_init='orthogonal', forget_bias_init='one', activation='tanh', inner_activation='hard_sigmoid', W_regularizer=None, U_regularizer=None, b_regularizer=None, dropout_W=0.0, dropout_U=0.0)
forget_bias_init:遗忘门偏置的初始化函数,Jozefowicz et al.建议初始化为全1元素
inner_activation:内部单元激活函数
tf.keras.layers.Embedding(
input_dim,
output_dim,
embeddings_initializer='uniform',
embeddings_regularizer=None,
embeddings_constraint=None,
mask_zero=False,
weights=None,
lora_rank=None,
**kwargs
)
Args |
|
---|---|
input_dim |
整数。词汇表的大小,即最大整数索引+1。 |
output_dim |
整数。输出的维度 |
embeddings_initializer |
嵌入矩阵的初始化器 |
embeddings_regularizer |
在嵌入矩阵中应用的正则化函数 |
embeddings_constraint |
在嵌入矩阵中应用的约束函数 (see keras.constraints). |
mask_zero |
布尔值,无论输入值0是否是应该屏蔽的特殊“填充”值。当使用可能需要可变长度输入的循环层时,这很有用。如果为True,则模型中的所有后续层都需要支持掩码,否则将引发异常。如果mask_zero设置为True,则索引0不能在词汇表中使用(input_dim应等于词汇表大小+1)。 |
weights |
可选大小的浮点矩阵(input_dim,output_dim)。要使用的初始嵌入值。 |
lora_rank |
可选整数。如果设置,该层的前向传递将使用提供的秩实现LoRA(低秩自适应)。LoRA将层的嵌入矩阵设置为不可训练,并将其替换为原始矩阵上的增量,该增量是通过将两个较低阶的可训练矩阵相乘获得的。这有助于降低微调大型嵌入层的计算成本。您还可以通过调用layer.enable_LoRA(rank)在现有的嵌入层上启用LoRA。 |
model = keras.Sequential()
model.add(keras.layers.Embedding(1000, 64))
# The model will take as input an integer matrix of size (batch,
# input_length), and the largest integer (i.e. word index) in the input
# should be no larger than 999 (vocabulary size).
# Now model.output_shape is (None, 10, 64), where `None` is the batch
# dimension.
input_array = np.random.randint(1000, size=(32, 10))
model.compile('rmsprop', 'mse')
output_array = model.predict(input_array)
print(output_array.shape)
只能作为模型第一层