Keras – 密集层
密集层 是常规的深度连接神经网络层。它是最常见和最经常使用的层。密集层对输入进行以下操作并返回输出。
output = activation(dot(input, kernel) + bias)
其中、
- 输入 代表输入数据
-
kernel 代表权重数据
-
dot 代表所有输入和其对应的权重的numpy点积
-
bias 代表机器学习中用于优化模型的偏置值
-
activation 代表激活函数。
让我们考虑以下的输入和权重样本,并尝试找到结果。
- 输入为2 x 2矩阵 [[1, 2], [3, 4] ] 。
-
内核为2 x 2矩阵 [[0.5, 0.75], [0.25, 0.5] ] 。
-
偏置值为 0
-
激活为 线性。 正如我们前面所学,线性激活没有任何作用。
>>> import numpy as np
>>> input = [ [1, 2], [3, 4] ]
>>> kernel = [ [0.5, 0.75], [0.25, 0.5] ]
>>> result = np.dot(input, kernel)
>>> result array([[1. , 1.75], [2.5 , 4.25]])
>>>
结果 是输出,它将被传递到下一个层。
密集层的输出形状将受到密集层中指定的神经元/单元数量的影响。例如,如果输入形状是 ( 8 ,) ,单元数是16,那么输出形状就是 (16,)。 所有的层都将以批量大小为第一维度,因此,输入形状将以 (None,8) 表示,输出形状为 (None,16)。 目前,批量大小是无,因为它没有被设置。批量大小通常在训练阶段设置。
>>> from keras.models import Sequential
>>> from keras.layers import Activation, Dense
>>> model = Sequential()
>>> layer_1 = Dense(16, input_shape = (8,))
>>> model.add(layer_1)
>>> layer_1.input_shape
(None, 8)
>>> layer_1.output_shape
(None, 16)
>>>
其中、
- layer_1.input_shape 返回该层的输入形状。
-
layer_1.output_shape 返回该层的输出形状。
密集层 支持的参数如下
- units 代表单元的数量,它影响到输出层。
-
activation 代表激活函数。
-
use_bias 表示该层是否使用偏置矢量。
-
kernel_initializer 表示用于内核的初始化器。
-
bias_initializer 表示用于偏置向量的初始化器。
-
kernel_regularizer 表示应用于kernel权重矩阵的正则函数。
-
bias_regularizer 表示应用于偏置向量的正则函数。
-
activity_regularizer 表示应用于该层输出的正则函数。
-
kernel_constraint 表示应用于kernel权重矩阵的约束函数。
-
bias_constraint 代表应用于偏置向量的约束函数。
正如你所看到的,没有一个参数可以用来指定输入数据的 input_shape 。 input_shape 是一个特殊的参数,只有当它被设计为模型中的第一层时,层才会接受这个参数。
此外,所有的Keras层都有一些共同的方法,它们如下: 1.
get_weights
获取该层中使用的权重的完整列表。
>>> from keras.models import Sequential
>>> from keras.layers import Activation, Dense
>>> model = Sequential()
>>> layer_1 = Dense(16, input_shape = (8,))
>>> model.add(layer_1)
>>> layer_1.get_weights()
>>> [array([[-0.19929028, 0.4162618 , 0.20081699,
-0.25589502, 0.3612864 , 0.25088787, -0.47544873, 0.0321095 ,
-0.26070702, -0.24102116, 0.32778358, 0.4667952 , -0.43322265,
-0.14500427, 0.04341269, -0.34929228], [ 0.41898954, 0.42256463,
0.2399621 , -0.272717 , -0.37069297, -0.37802136, 0.11428618, 0.12749982,
0.10182762, 0.14897704, 0.06569374, 0.15424263, 0.42638576, 0.34037888, -0.15504825,
-0.0740819 ], [-0.3132702 , 0.34885168, -0.3259498 , -0.47076607, 0.33696914,
-0.49143505, -0.04318619, -0.11252558, 0.29669464, -0.28431225, -0.43165374,
-0.49687648, 0.13632 , -0.21099591, -0.10608876, -0.13568914], [-0.27421212,
-0.180812 , 0.37240648, 0.25100648, -0.07199466, -0.23680925, -0.21271884,
-0.08706653, 0.4393121 , 0.23259485, 0.2616762 , 0.23966897, -0.4502542 , 0.0058881
, 0.14847124, 0.08835125], [-0.36905527, 0.08948278, -0.19254792, 0.26783705,
0.25979865, -0.46963632, 0.32761025, -0.25718856, 0.48987913, 0.3588251 ,
-0.06586111, 0.2591269 , 0.48289275, 0.3368858 , -0.17145419, -0.35674667],
[-0.32851398, 0.42289603, -0.47025883, 0.29027188, -0.0498147 , 0.46215963,
-0.10123312, 0.23069787, 0.00844061, -0.11867595, -0.2602347 ,
-0.27917898, 0.22910392, 0.18214619, -0.40857887, 0.2606709 ], [-0.19066167,
-0.11464512, -0.06768692, -0.21878994, -0.2573272 , 0.13698077, 0.45221198,
0.10634196, 0.06784797, 0.07192957, 0.2946936 ,
0.04968262, -0.15899467, 0.15757453, -0.1343019 , 0.24561536], [-0.04272163,
0.48315823, -0.13382411, 0.01752126, -0.1630218 , 0.4629662 , -0.21412933,
-0.1445911 , -0.03567278, -0.20948446, 0.15742278, 0.11139905, 0.11066687,
0.17430818, 0.36413217, 0.19864106]], dtype=float32), array([0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype = float32)]
>>>
- set_weights – 设置该层的权重。
-
get_config – 获取该层的完整配置,作为一个对象,可以在任何时候重新加载。
config = layer_1.get_config()
from_config
从该层的配置对象中加载该层。
config = layer_1.get_config() reload_layer = Dense.from_config(config)
输入形状(input_shape)
获取输入形状,如果该层只有一个节点。
>>> from keras.models import Sequential
>>> from keras.layers import Activation, Dense
>>> model = Sequential()
>>> layer_1 = Dense(16, input_shape = (8,))
>>> model.add(layer_1)
>>> layer_1.get_weights()
>>> layer_1.input_shape
(None, 8)
输入
获取输入数据,如果该层只有一个节点。
>>> from keras.models import Sequential
>>> from keras.layers import Activation, Dense
>>> model = Sequential()
>>> layer_1 = Dense(16, input_shape = (8,))
>>> model.add(layer_1)
>>> layer_1.get_weights()
>>> layer_1.input
<tf.Tensor 'dense_1_input:0' shape = (?, 8) dtype = float32>
- get_input_at – 如果该层有多个节点,在指定的索引处获取输入数据。
-
get_input_shape_at – 如果该层有多个节点,在指定的索引处获取输入形状。
-
output_shape – 如果该层只有一个节点,则获取输出形状。
>>> from keras.models import Sequential
>>> from keras.layers import Activation, Dense
>>> model = Sequential()
>>> layer_1 = Dense(16, input_shape = (8,))
>>> model.add(layer_1)
>>> layer_1.get_weights()
>>> layer_1.output_shape (None, 16)
输出
获取输出数据,如果该层只有一个节点。
>>> from keras.models import Sequential
>>> from keras.layers import Activation, Dense
>>> model = Sequential()
>>> layer_1 = Dense(16, input_shape = (8,))
>>> model.add(layer_1)
>>> layer_1.get_weights()
>>> layer_1.output
<tf.Tensor 'dense_1/BiasAdd:0' shape = (?, 16) dtype = float32>
-
get_output_at – 如果该层有多个节点,在指定的索引处获取输出数据。
-
get_output_shape at -_ 如果该层有多个节点,则在指定的索引处获取输出形状。