layers是重点部分,该部分包含了各种网络结构以及激活函数等。下面一一讲解
tf.keras.layers.Activation(activation, **kwargs)
因此参数activation为具体的激活函数。keras中activation参数的值一般取如下:
’elu’, ‘exponential’, ‘hard_sigmoind’, ‘linear’, ‘relu’, ‘selu’, ‘sigmoid’, ‘softmax’, ‘softplus’, ‘softsign’, ‘swish’, ‘tanh’,或者自定义激活函数
课程2中单独讲述了激活函数,当时是tf.keras.activation.relu(),而此时为tf.keras.layers.Activation(‘relu’)。这两者的有什么区别呢?
tf.keras.layers.Activation(‘relu’)常用于深度学习网络结构中,tf.keras.activation.relu()常用于数学运算。
def lstm(max_len, max_cnt, embed_size, embedding_matrix):
_input = Input(shape=(max_len,), dtype='int32')
_embed = Embedding(max_cnt, embed_size, input_length=max_len, weights=[embedding_matrix], trainable=False)(_input)
_embed = SpatialDropout1D(0.1)(_embed)
lstm_result = CuDNNLSTM(100, return_sequences=False)(_embed)
fc = Dropout(0.1)(lstm_result)
fc = Dense(13)(fc)
fc = Dropout(0.1)(fc)
preds = Activation('softmax')(fc) # 深度学习网络结构
model = Model(inputs=_input, outputs=preds)
return model
Dense即线性层,其结构如下:
tf.keras.layers.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,
**kwargs
)
各参数含义如下:
参数中regularizer是正则化项,kernel_regularizer就是对权重添加正则化项,以l2为例,对权重添加正则化项后,损失函数变为:
bias_regularizer原理相同(bias也可以看做是 ω \omega ω)。重点是activity_regularizer,该参数表示对输出项(激活项后的输出)添加正则化。个人理解添加后,损失函数变为如下:
∑ ∣ ∣ L ( y i ^ , y i ∣ ∣ 2 2 \sum||L(\hat{y_i}, y_i||_2^2 ∑∣∣L(yi^,yi∣∣22,个人猜测,未经源码验证。
权重和输出添加正则化的目的:
- 当对权重添加正则化后,权重的值会局限于某一范围内,使得原来很大的值相对变小
- 当我们需要输出很小时,虽然对权重添加了正则化(使得权重值变小)但由于x本身很大,输出仍然可能很大,因此,此时对输出添加权重项,使得输出变小。
constraint为约束项,比如最大权重约束,可以将权重的值约束到小于某个值,还可以将权重约到某一范围(小于等于x,大于等于y),具体约束方法见keras中的constraint。
注意:
本章讲述卷积神经网络。其默认表达如下:
tf.keras.layers.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, **kwargs
)
其参数解析如下:
其中padding的方式有两种,‘valid’/‘same’(不区分大小写)
最大池化层,结构如下:
tf.keras.layers.MaxPool2D(
pool_size=(2, 2), strides=None, padding=‘valid’, data_format=None, **kwargs
)
参数如下,具体可参考Conv2D
最大全局池化,结构如下:
tf.keras.layers.GlobalMaxPool2D(
data_format=None, **kwargs
)
data_format:channels_last or channels_first。默认为在〜/ .keras / keras.json中的Keras配置文件中找到的image_data_format值。 如果从未设置,那么默认是“ channels_last”。
平均池化层,结构如下:
tf.keras.layers.AveragePooling2D(
pool_size=(2, 2), strides=None, padding=‘valid’, data_format=None, **kwargs
)
全局平均池化
tf.keras.layers.GlobalAveragePooling2D(
data_format=None, **kwargs
)
主要应用于textcnn,结构如下:
tf.keras.layers.Conv1D(
filters, kernel_size, strides=1, padding=‘valid’, data_format=‘channels_last’,
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, **kwargs
)
参数的具体含义见Con2D,注意,这里的padding有三种选择"valid"/‘same’/‘causal’
tf.keras.layers.MaxPool1D(
pool_size=2, strides=None, padding=‘valid’, data_format=‘channels_last’,
**kwargs
)
一般地,一维卷积常用于textcnn模型,此时,池化层通常为全局最大池化或全局平均池化。如果非要用MaxPool1D,卷积层的输出(batch_size, new_step, filters)中的filters就是这里输入(batch_size, steps, features)的features
同MaxPool1D
tf.keras.layers.AveragePooling1D(
pool_size=2, strides=None, padding=‘valid’, data_format=‘channels_last’,
**kwargs
)
tf.keras.layers.GlobalMaxPool1D(
data_format=‘channels_last’, **kwargs
)
一维卷积层的输出(batch_size, new_step, filters)中的filters就是这里输入(batch_size, steps, features)的features
在keras中,关于RNN神经网络共有四个接口AbstractRNNCell、RNN、SimpleRNN、SimpleRNNCell。
其结构如下:
tf.keras.layers.SimpleRNNCell(
units, activation=‘tanh’, use_bias=True, kernel_initializer=‘glorot_uniform’,
recurrent_initializer=‘orthogonal’, bias_initializer=‘zeros’,
kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None,
kernel_constraint=None, recurrent_constraint=None, bias_constraint=None,
dropout=0.0, recurrent_dropout=0.0, **kwargs
)
参数入下:
这里主要关注三个参数:
从上面可以看出,dropout应用于线性变化,当然这个线性变化在不同模型中可以有不同的状态,如输入状态,循环状态。
一般来讲SimpleRNNCell需要搭配RNN使用(作为RNN cell参数的值),具体会在RNN中讲解,其简单案例如下所示:
inputs = np.random.random([32, 10, 8]).astype(np.float32)
rnn = tf.keras.layers.RNN(tf.keras.layers.SimpleRNNCell(4))
output = rnn(inputs) # The output has shape `[32, 4]`.
rnn = tf.keras.layers.RNN(
tf.keras.layers.SimpleRNNCell(4),
return_sequences=True,
return_state=True)
# whole_sequence_output has shape `[32, 10, 4]`.
# final_state has shape `[32, 4]`.
whole_sequence_output, final_state = rnn(inputs)
搭配SimpleRNNCell使用即可构成RNN模型。其结构如下:
tf.keras.layers.RNN(
cell, return_sequences=False, return_state=False, go_backwards=False,
stateful=False, unroll=False, time_major=False, **kwargs
)
参数如下:
平时所用的RNN模型就用的这个API,结构如下:
tf.keras.layers.SimpleRNN(
units, activation=‘tanh’, use_bias=True, kernel_initializer=‘glorot_uniform’,
recurrent_initializer=‘orthogonal’, bias_initializer=‘zeros’,
kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None,
activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None,
bias_constraint=None, dropout=0.0, recurrent_dropout=0.0,
return_sequences=False, return_state=False, go_backwards=False, stateful=False,
unroll=False, **kwargs
)
参数如下:
关于模型的输入和输出结构,由以下几个参数决定:return_sequence,return_state,time_major。