[[source]][[source]](https://github.com/keras-team/keras/blob/master/keras/layers/merge.py#L283)
81 | ### Average
82 |
83 | ```python
84 | keras.layers.Average()
85 | ```
86 |
87 | 计算输入张量列表的平均值。
88 |
89 | 它接受一个张量的列表,
90 | 所有的张量必须有相同的输入尺寸,
91 | 然后返回一个张量(和输入张量尺寸相同)。
92 |
93 | ----
94 |
95 | [[source]](https://github.com/keras-team/keras/blob/master/keras/layers/merge.py#L298)
96 | ### Maximum
97 |
98 | ```python
99 | keras.layers.Maximum()
100 | ```
101 |
102 | 计算输入张量列表的(逐元素间的)最大值。
103 |
104 | 它接受一个张量的列表,
105 | 所有的张量必须有相同的输入尺寸,
106 | 然后返回一个张量(和输入张量尺寸相同)。
107 |
108 | ----
109 |
110 | [[source]](https://github.com/keras-team/keras/blob/master/keras/layers/merge.py#L313)
111 | ### Minimum
112 |
113 | ```python
114 | keras.layers.Minimum()
115 | ```
116 |
117 | 计算输入张量列表的(逐元素间的)最小值。
118 |
119 | 它接受一个张量的列表,
120 | 所有的张量必须有相同的输入尺寸,
121 | 然后返回一个张量(和输入张量尺寸相同)。
122 |
123 | ----
124 |
125 | [[source]](https://github.com/keras-team/keras/blob/master/keras/layers/merge.py#L320)
126 | ### Concatenate
127 |
128 | ```python
129 | keras.layers.Concatenate(axis=-1)
130 | ```
131 |
132 | 连接一个输入张量的列表。
133 |
134 | 它接受一个张量的列表,
135 | 除了连接轴之外,其他的尺寸都必须相同,
136 | 然后返回一个由所有输入张量连接起来的输出张量。
137 |
138 | __参数__
139 |
140 | - __axis__: 连接的轴。
141 | - __**kwargs__: 层关键字参数。
142 |
143 | ----
144 |
145 | [[source]](https://github.com/keras-team/keras/blob/master/keras/layers/merge.py#L416)
146 | ### Dot
147 |
148 | ```python
149 | keras.layers.Dot(axes, normalize=False)
150 | ```
151 |
152 | 计算两个张量之间样本的点积。
153 |
154 | 例如,如果作用于输入尺寸为 `(batch_size, n)` 的两个张量 `a` 和 `b`,
155 | 那么输出结果就会是尺寸为 `(batch_size, 1)` 的一个张量。
156 | 在这个张量中,每一个条目 `i` 是 `a[i]` 和 `b[i]` 之间的点积。
157 |
158 | __参数__
159 |
160 | - __axes__: 整数或者整数元组,
161 | 一个或者几个进行点积的轴。
162 | - __normalize__: 是否在点积之前对即将进行点积的轴进行 L2 标准化。
163 | 如果设置成 `True`,那么输出两个样本之间的余弦相似值。
164 | - __**kwargs__: 层关键字参数。
165 |
166 | ----
167 |
168 | ### add
169 |
170 |
171 | ```python
172 | keras.layers.add(inputs)
173 | ```
174 |
175 | `Add` 层的函数式接口。
176 |
177 | __参数__
178 |
179 | - __inputs__: 一个输入张量的列表(列表大小至少为 2)。
180 | - __**kwargs__: 层关键字参数。
181 |
182 | __返回__
183 |
184 | 一个张量,所有输入张量的和。
185 |
186 | __示例__
187 |
188 |
189 | ```python
190 | import keras
191 |
192 | input1 = keras.layers.Input(shape=(16,))
193 | x1 = keras.layers.Dense(8, activation='relu')(input1)
194 | input2 = keras.layers.Input(shape=(32,))
195 | x2 = keras.layers.Dense(8, activation='relu')(input2)
196 | added = keras.layers.add([x1, x2])
197 |
198 | out = keras.layers.Dense(4)(added)
199 | model = keras.models.Model(inputs=[input1, input2], outputs=out)
200 | ```
201 |
202 | ----
203 |
204 | ### subtract
205 |
206 |
207 | ```python
208 | keras.layers.subtract(inputs)
209 | ```
210 |
211 | `Subtract` 层的函数式接口。
212 |
213 | __参数__
214 |
215 | - __inputs__: 一个列表的输入张量(列表大小准确为 2)。
216 | - __**kwargs__: 层的关键字参数。
217 |
218 | __返回__
219 |
220 | 一个张量,两个输入张量的差。
221 |
222 | __示例__
223 |
224 |
225 | ```python
226 | import keras
227 |
228 | input1 = keras.layers.Input(shape=(16,))
229 | x1 = keras.layers.Dense(8, activation='relu')(input1)
230 | input2 = keras.layers.Input(shape=(32,))
231 | x2 = keras.layers.Dense(8, activation='relu')(input2)
232 | subtracted = keras.layers.subtract([x1, x2])
233 |
234 | out = keras.layers.Dense(4)(subtracted)
235 | model = keras.models.Model(inputs=[input1, input2], outputs=out)
236 | ```
237 |
238 | ----
239 |
240 | ### multiply
241 |
242 |
243 | ```python
244 | keras.layers.multiply(inputs)
245 | ```
246 |
247 |
248 | `Multiply` 层的函数式接口。
249 |
250 | __参数__
251 |
252 | - __inputs__: 一个列表的输入张量(列表大小至少为 2)。
253 | - __**kwargs__: 层的关键字参数。
254 |
255 | __返回__
256 |
257 | 一个张量,所有输入张量的逐元素乘积。
258 |
259 | ----
260 |
261 | ### average
262 |
263 |
264 | ```python
265 | keras.layers.average(inputs)
266 | ```
267 |
268 |
269 | `Average` 层的函数式接口。
270 |
271 | __参数__
272 |
273 | - __inputs__: 一个列表的输入张量(列表大小至少为 2)。
274 | - __**kwargs__: 层的关键字参数。
275 |
276 | __返回__
277 |
278 | 一个张量,所有输入张量的平均值。
279 |
280 | ----
281 |
282 | ### maximum
283 |
284 |
285 | ```python
286 | keras.layers.maximum(inputs)
287 | ```
288 |
289 | `Maximum` 层的函数式接口。
290 |
291 | __参数__
292 |
293 | - __inputs__: 一个列表的输入张量(列表大小至少为 2)。
294 | - __**kwargs__: 层的关键字参数。
295 |
296 | __返回__
297 |
298 | 一个张量,所有张量的逐元素的最大值。
299 |
300 | ----
301 |
302 | ### minimum
303 |
304 |
305 | ```python
306 | keras.layers.minimum(inputs)
307 | ```
308 |
309 |
310 | `Minimum` 层的函数式接口。
311 |
312 | __参数__
313 |
314 | - __inputs__: 一个列表的输入张量(列表大小至少为 2)。
315 | - __**kwargs__: 层的关键字参数。
316 |
317 | __返回__
318 |
319 | 一个张量,所有张量的逐元素的最小值。
320 |
321 | ----
322 |
323 | ### concatenate
324 |
325 |
326 | ```python
327 | keras.layers.concatenate(inputs, axis=-1)
328 | ```
329 |
330 |
331 | `Concatenate` 层的函数式接口。
332 |
333 | __参数__
334 |
335 | - __inputs__: 一个列表的输入张量(列表大小至少为 2)。
336 | - __axis__: 串联的轴。
337 | - __**kwargs__: 层的关键字参数。
338 |
339 | __返回__
340 |
341 | 一个张量,所有输入张量通过 `axis` 轴串联起来的输出张量。
342 |
343 | ----
344 |
345 | ### dot
346 |
347 |
348 | ```python
349 | keras.layers.dot(inputs, axes, normalize=False)
350 | ```
351 |
352 |
353 | `Dot` 层的函数式接口。
354 |
355 | __参数__
356 |
357 | - __inputs__: 一个列表的输入张量(列表大小至少为 2)。
358 | - __axes__: 整数或者整数元组,
359 | 一个或者几个进行点积的轴。
360 | - __normalize__: 是否在点积之前对即将进行点积的轴进行 L2 标准化。
361 | 如果设置成 True,那么输出两个样本之间的余弦相似值。
362 | - __**kwargs__: 层的关键字参数。
363 |
364 | __返回__
365 |
366 | 一个张量,所有输入张量样本之间的点积。
367 |
--------------------------------------------------------------------------------
/sources/layers/noise.md:
--------------------------------------------------------------------------------
1 | [[source]](https://github.com/keras-team/keras/blob/master/keras/layers/noise.py#L14)
2 | ### GaussianNoise
3 |
4 | ```python
5 | keras.layers.GaussianNoise(stddev)
6 | ```
7 |
8 | 应用以 0 为中心的加性高斯噪声。
9 |
10 | 这对缓解过拟合很有用
11 | (你可以将其视为随机数据增强的一种形式)。
12 | 高斯噪声(GS)是对真实输入的腐蚀过程的自然选择。
13 |
14 | 由于它是一个正则化层,因此它只在训练时才被激活。
15 |
16 | __参数__
17 |
18 | - __stddev__: float,噪声分布的标准差。
19 |
20 | __输入尺寸__
21 |
22 | 可以是任意的。
23 | 如果将该层作为模型的第一层,则需要指定 `input_shape` 参数
24 | (整数元组,不包含样本数量的维度)。
25 |
26 | __输出尺寸__
27 |
28 | 与输入相同。
29 |
30 | ----
31 |
32 | [[source]](https://github.com/keras-team/keras/blob/master/keras/layers/noise.py#L58)
33 | ### GaussianDropout
34 |
35 | ```python
36 | keras.layers.GaussianDropout(rate)
37 | ```
38 |
39 | 应用以 1 为中心的 乘性高斯噪声。
40 |
41 | 由于它是一个正则化层,因此它只在训练时才被激活。
42 |
43 | __参数__
44 |
45 | - __rate__: float,丢弃概率(与 `Dropout` 相同)。
46 | 这个乘性噪声的标准差为 `sqrt(rate / (1 - rate))`。
47 |
48 | __输入尺寸__
49 |
50 | 可以是任意的。
51 | 如果将该层作为模型的第一层,则需要指定 `input_shape` 参数
52 | (整数元组,不包含样本数量的维度)。
53 |
54 | __输出尺寸__
55 |
56 | 与输入相同。
57 |
58 | __参考文献__
59 |
60 | - [Dropout: A Simple Way to Prevent Neural Networks from Overfitting Srivastava, Hinton, et al. 2014](http://www.cs.toronto.edu/~rsalakhu/papers/srivastava14a.pdf)
61 |
62 | ----
63 |
64 | [[source]](https://github.com/keras-team/keras/blob/master/keras/layers/noise.py#L106)
65 | ### AlphaDropout
66 |
67 | ```python
68 | keras.layers.AlphaDropout(rate, noise_shape=None, seed=None)
69 | ```
70 |
71 | 将 Alpha Dropout 应用到输入。
72 |
73 | Alpha Dropout 是一种 `Dropout`,
74 | 它保持输入的平均值和方差与原来的值不变,
75 | 以确保即使在 dropout 后也能实现自我归一化。
76 | 通过随机将激活设置为负饱和值,
77 | Alpha Dropout 非常适合按比例缩放的指数线性单元(SELU)。
78 |
79 | __参数__
80 |
81 | - __rate__: float,丢弃概率(与 `Dropout` 相同)。
82 | 这个乘性噪声的标准差为 `sqrt(rate / (1 - rate))`。
83 | - __noise_shape__: 一个类型为 `int32` 的 1D `Tensor`,表示随机生成 keep/drop 标识的尺寸。
84 | - __seed__: 用作随机种子的 Python 整数。
85 |
86 | __输入尺寸__
87 |
88 | 可以是任意的。
89 | 如果将该层作为模型的第一层,则需要指定 `input_shape` 参数
90 | (整数元组,不包含样本数量的维度)。
91 |
92 | __输出尺寸__
93 |
94 | 与输入相同。
95 |
96 | __参考文献__
97 |
98 | - [Self-Normalizing Neural Networks](https://arxiv.org/abs/1706.02515)
99 |
--------------------------------------------------------------------------------
/sources/layers/normalization.md:
--------------------------------------------------------------------------------
1 | [[source]](https://github.com/keras-team/keras/blob/master/keras/layers/normalization.py#L16)
2 | ### BatchNormalization
3 |
4 | ```python
5 | keras.layers.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, beta_initializer='zeros', gamma_initializer='ones', moving_mean_initializer='zeros', moving_variance_initializer='ones', beta_regularizer=None, gamma_regularizer=None, beta_constraint=None, gamma_constraint=None)
6 | ```
7 |
8 | 批量标准化层 (Ioffe and Szegedy, 2014)。
9 |
10 | 在每一个批次的数据中标准化前一层的激活项,
11 | 即,应用一个维持激活项平均值接近 0,标准差接近 1 的转换。
12 |
13 | __参数__
14 |
15 | - __axis__: 整数,需要标准化的轴
16 | (通常是特征轴)。
17 | 例如,在 `data_format="channels_first"` 的 `Conv2D` 层之后,
18 | 在 `BatchNormalization` 中设置 `axis=1`。
19 | - __momentum__: 移动均值和移动方差的动量。
20 | - __epsilon__: 增加到方差的小的浮点数,以避免除以零。
21 | - __center__: 如果为 True,把 `beta` 的偏移量加到标准化的张量上。
22 | 如果为 False, `beta` 被忽略。
23 | - __scale__: 如果为 True,乘以 `gamma`。
24 | 如果为 False,`gamma` 不使用。
25 | 当下一层为线性层(或者例如 `nn.relu`),
26 | 这可以被禁用,因为缩放将由下一层完成。
27 | - __beta_initializer__: beta 权重的初始化方法。
28 | - __gamma_initializer__: gamma 权重的初始化方法。
29 | - __moving_mean_initializer__: 移动均值的初始化方法。
30 | - __moving_variance_initializer__: 移动方差的初始化方法。
31 | - __beta_regularizer__: 可选的 beta 权重的正则化方法。
32 | - __gamma_regularizer__: 可选的 gamma 权重的正则化方法。
33 | - __beta_constraint__: 可选的 beta 权重的约束方法。
34 | - __gamma_constraint__: 可选的 gamma 权重的约束方法。
35 |
36 | __输入尺寸__
37 |
38 | 可以是任意的。如果将这一层作为模型的第一层, 则需要指定 `input_shape` 参数 (整数元组,不包含样本数量的维度)。
39 |
40 | __输出尺寸__
41 |
42 | 与输入相同。
43 |
44 | __参考文献__
45 |
46 | - [Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift](https://arxiv.org/abs/1502.03167)
47 |
--------------------------------------------------------------------------------
/sources/layers/wrappers.md:
--------------------------------------------------------------------------------
1 | [[source]](https://github.com/keras-team/keras/blob/master/keras/layers/wrappers.py#L116)
2 | ### TimeDistributed
3 |
4 | ```python
5 | keras.layers.TimeDistributed(layer)
6 | ```
7 |
8 | 这个封装器将一个层应用于输入的每个时间片。
9 |
10 | 输入至少为 3D,且第一个维度应该是时间所表示的维度。
11 |
12 | 考虑 32 个样本的一个 batch,
13 | 其中每个样本是 10 个 16 维向量的序列。
14 | 那么这个 batch 的输入尺寸为 `(32, 10, 16)`,
15 | 而 `input_shape` 不包含样本数量的维度,为 `(10, 16)`。
16 |
17 | 你可以使用 `TimeDistributed` 来将 `Dense` 层独立地应用到
18 | 这 10 个时间步的每一个:
19 |
20 | ```python
21 | # 作为模型第一层
22 | model = Sequential()
23 | model.add(TimeDistributed(Dense(8), input_shape=(10, 16)))
24 | # 现在 model.output_shape == (None, 10, 8)
25 | ```
26 |
27 | 输出的尺寸为 `(32, 10, 8)`。
28 |
29 | 在后续的层中,将不再需要 `input_shape`:
30 |
31 | ```python
32 | model.add(TimeDistributed(Dense(32)))
33 | # 现在 model.output_shape == (None, 10, 32)
34 | ```
35 |
36 | 输出的尺寸为 `(32, 10, 32)`。
37 |
38 | `TimeDistributed` 可以应用于任意层,不仅仅是 `Dense`,
39 | 例如运用于 `Conv2D` 层:
40 |
41 | ```python
42 | model = Sequential()
43 | model.add(TimeDistributed(Conv2D(64, (3, 3)),
44 | input_shape=(10, 299, 299, 3)))
45 | ```
46 |
47 | __参数__
48 |
49 | - __layer__: 一个网络层实例。
50 |
51 | ----
52 |
53 | [[source]](https://github.com/keras-team/keras/blob/master/keras/layers/wrappers.py#L335)
54 | ### Bidirectional
55 |
56 | ```python
57 | keras.layers.Bidirectional(layer, merge_mode='concat', weights=None)
58 | ```
59 |
60 | RNN 的双向封装器,对序列进行前向和后向计算。
61 |
62 | __参数__
63 |
64 | - __layer__: `Recurrent` 实例。
65 | - __merge_mode__: 前向和后向 RNN 的输出的结合模式。
66 | 为 {'sum', 'mul', 'concat', 'ave', None} 其中之一。
67 | 如果是 None,输出不会被结合,而是作为一个列表被返回。
68 | - __weights__: 双向模型中要加载的初始权重。
69 |
70 | __异常__
71 |
72 | - __ValueError__: 如果参数 `merge_mode` 非法。
73 |
74 | __示例__
75 |
76 |
77 | ```python
78 | model = Sequential()
79 | model.add(Bidirectional(LSTM(10, return_sequences=True),
80 | input_shape=(5, 10)))
81 | model.add(Bidirectional(LSTM(10)))
82 | model.add(Dense(5))
83 | model.add(Activation('softmax'))
84 | model.compile(loss='categorical_crossentropy', optimizer='rmsprop')
85 | ```
86 |
--------------------------------------------------------------------------------
/sources/layers/writing-your-own-keras-layers.md:
--------------------------------------------------------------------------------
1 | # 编写你自己的 Keras 层
2 |
3 | 对于简单、无状态的自定义操作,你也许可以通过 `layers.core.Lambda` 层来实现。但是对于那些包含了可训练权重的自定义层,你应该自己实现这种层。
4 |
5 | 这是一个 **Keras 2.0** 中,Keras 层的骨架(如果你用的是旧的版本,请更新到新版)。你只需要实现三个方法即可:
6 |
7 | - `build(input_shape)`: 这是你定义权重的地方。这个方法必须设 `self.built = True`,可以通过调用 `super([Layer], self).build()` 完成。
8 | - `call(x)`: 这里是编写层的功能逻辑的地方。你只需要关注传入 `call` 的第一个参数:输入张量,除非你希望你的层支持masking。
9 | - `compute_output_shape(input_shape)`: 如果你的层更改了输入张量的形状,你应该在这里定义形状变化的逻辑,这让Keras能够自动推断各层的形状。
10 |
11 | ```python
12 | from keras import backend as K
13 | from keras.engine.topology import Layer
14 |
15 | class MyLayer(Layer):
16 |
17 | def __init__(self, output_dim, **kwargs):
18 | self.output_dim = output_dim
19 | super(MyLayer, self).__init__(**kwargs)
20 |
21 | def build(self, input_shape):
22 | # 为该层创建一个可训练的权重
23 | self.kernel = self.add_weight(name='kernel',
24 | shape=(input_shape[1], self.output_dim),
25 | initializer='uniform',
26 | trainable=True)
27 | super(MyLayer, self).build(input_shape) # 一定要在最后调用它
28 |
29 | def call(self, x):
30 | return K.dot(x, self.kernel)
31 |
32 | def compute_output_shape(self, input_shape):
33 | return (input_shape[0], self.output_dim)
34 | ```
35 |
36 |
37 | 还可以定义具有多个输入张量和多个输出张量的 Keras 层。
38 | 为此,你应该假设方法 `build(input_shape)`,`call(x)`
39 | 和 `compute_output_shape(input_shape)` 的输入输出都是列表。
40 | 这里是一个例子,与上面那个相似:
41 |
42 | ```python
43 | from keras import backend as K
44 | from keras.engine.topology import Layer
45 |
46 | class MyLayer(Layer):
47 |
48 | def __init__(self, output_dim, **kwargs):
49 | self.output_dim = output_dim
50 | super(MyLayer, self).__init__(**kwargs)
51 |
52 | def build(self, input_shape):
53 | assert isinstance(input_shape, list)
54 | # 为该层创建一个可训练的权重
55 | self.kernel = self.add_weight(name='kernel',
56 | shape=(input_shape[0][1], self.output_dim),
57 | initializer='uniform',
58 | trainable=True)
59 | super(MyLayer, self).build(input_shape) # 一定要在最后调用它
60 |
61 | def call(self, x):
62 | assert isinstance(x, list)
63 | a, b = x
64 | return [K.dot(a, self.kernel) + b, K.mean(b, axis=-1)]
65 |
66 | def compute_output_shape(self, input_shape):
67 | assert isinstance(input_shape, list)
68 | shape_a, shape_b = input_shape
69 | return [(shape_a[0], self.output_dim), shape_b[:-1]]
70 | ```
71 |
72 | 已有的 Keras 层就是实现任何层的很好例子。不要犹豫阅读源码!
73 |
--------------------------------------------------------------------------------
/sources/losses.md:
--------------------------------------------------------------------------------
1 |
2 | ## 损失函数的使用
3 |
4 | 损失函数(或称目标函数、优化评分函数)是编译模型时所需的两个参数之一:
5 |
6 | ```python
7 | model.compile(loss='mean_squared_error', optimizer='sgd')
8 | ```
9 |
10 | ```python
11 | from keras import losses
12 |
13 | model.compile(loss=losses.mean_squared_error, optimizer='sgd')
14 | ```
15 |
16 | 你可以传递一个现有的损失函数名,或者一个 TensorFlow/Theano 符号函数。
17 | 该符号函数为每个数据点返回一个标量,有以下两个参数:
18 |
19 | - __y_true__: 真实标签。TensorFlow/Theano 张量。
20 | - __y_pred__: 预测值。TensorFlow/Theano 张量,其 shape 与 y_true 相同。
21 |
22 | 实际的优化目标是所有数据点的输出数组的平均值。
23 |
24 | 有关这些函数的几个例子,请查看 [losses source](https://github.com/keras-team/keras/blob/master/keras/losses.py)。
25 |
26 | ## 可用损失函数
27 |
28 | ### mean_squared_error
29 |
30 |
31 | ```python
32 | keras.losses.mean_squared_error(y_true, y_pred)
33 | ```
34 |
35 | ----
36 |
37 | ### mean_absolute_error
38 |
39 |
40 | ```python
41 | eras.losses.mean_absolute_error(y_true, y_pred)
42 | ```
43 |
44 | ----
45 |
46 | ### mean_absolute_percentage_error
47 |
48 |
49 | ```python
50 | keras.losses.mean_absolute_percentage_error(y_true, y_pred)
51 | ```
52 |
53 | ----
54 |
55 | ### mean_squared_logarithmic_error
56 |
57 |
58 | ```python
59 | keras.losses.mean_squared_logarithmic_error(y_true, y_pred)
60 | ```
61 |
62 | ----
63 |
64 | ### squared_hinge
65 |
66 |
67 | ```python
68 | keras.losses.squared_hinge(y_true, y_pred)
69 | ```
70 |
71 | ----
72 |
73 | ### hinge
74 |
75 |
76 | ```python
77 | keras.losses.hinge(y_true, y_pred)
78 | ```
79 |
80 | ----
81 |
82 | ### categorical_hinge
83 |
84 |
85 | ```python
86 | keras.losses.categorical_hinge(y_true, y_pred)
87 | ```
88 |
89 | ----
90 |
91 | ### logcosh
92 |
93 |
94 | ```python
95 | keras.losses.logcosh(y_true, y_pred)
96 | ```
97 |
98 | 预测误差的双曲余弦的对数。
99 |
100 | 对于小的 `x`,`log(cosh(x))` 近似等于 `(x ** 2) / 2`。对于大的 `x`,近似于 `abs(x) - log(2)`。这表示 'logcosh' 与均方误差大致相同,但是不会受到偶尔疯狂的错误预测的强烈影响。
101 |
102 | __参数__
103 |
104 | - __y_true__: 目标真实值的张量。
105 | - __y_pred__: 目标预测值的张量。
106 |
107 | __返回__
108 |
109 | 每个样本都有一个标量损失的张量。
110 |
111 | ----
112 |
113 | ### huber_loss
114 |
115 |
116 | ```python
117 | keras.losses.huber_loss(y_true, y_pred, delta=1.0)
118 | ```
119 |
120 | ---
121 |
122 | ### categorical_crossentropy
123 |
124 |
125 | ```python
126 | keras.losses.categorical_crossentropy(y_true, y_pred, from_logits=False, label_smoothing=0)
127 | ```
128 |
129 | ----
130 |
131 | ### sparse_categorical_crossentropy
132 |
133 |
134 | ```python
135 | keras.losses.sparse_categorical_crossentropy(y_true, y_pred, from_logits=False, axis=-1)
136 | ```
137 |
138 | ----
139 |
140 | ### binary_crossentropy
141 |
142 |
143 | ```python
144 | keras.losses.binary_crossentropy(y_true, y_pred, from_logits=False, label_smoothing=0)
145 | ```
146 |
147 | ----
148 |
149 | ### kullback_leibler_divergence
150 |
151 |
152 | ```python
153 | keras.losses.kullback_leibler_divergence(y_true, y_pred)
154 | ```
155 |
156 | ----
157 |
158 | ### poisson
159 |
160 |
161 | ```python
162 | keras.losses.poisson(y_true, y_pred)
163 | ```
164 |
165 | ----
166 |
167 | ### cosine_proximity
168 |
169 |
170 | ```python
171 | keras.losses.cosine_proximity(y_true, y_pred, axis=-1)
172 | ```
173 |
174 | ---
175 |
176 | ### is_categorical_crossentropy
177 |
178 | ```python
179 | keras.losses.is_categorical_crossentropy(loss)
180 | ```
181 |
182 | ----
183 |
184 | **注意**: 当使用 `categorical_crossentropy` 损失时,你的目标值应该是分类格式 (即,如果你有 10 个类,每个样本的目标值应该是一个 10 维的向量,这个向量除了表示类别的那个索引为 1,其他均为 0)。 为了将 *整数目标值* 转换为 *分类目标值*,你可以使用 Keras 实用函数 `to_categorical`:
185 |
186 | ```python
187 | from keras.utils.np_utils import to_categorical
188 |
189 | categorical_labels = to_categorical(int_labels, num_classes=None)
190 | ```
191 |
192 | 当使用 sparse_categorical_crossentropy 损失时,你的目标应该是整数。如果你是类别目标,应该使用 categorical_crossentropy。
193 |
194 | categorical_crossentropy 是多类对数损失的另一种形式。
195 |
--------------------------------------------------------------------------------
/sources/metrics.md:
--------------------------------------------------------------------------------
1 |
2 | ## 评价函数的用法
3 |
4 | 评价函数用于评估当前训练模型的性能。当模型编译后(compile),评价函数应该作为 `metrics` 的参数来输入。
5 |
6 | ```python
7 | model.compile(loss='mean_squared_error',
8 | optimizer='sgd',
9 | metrics=['mae', 'acc'])
10 | ```
11 |
12 | ```python
13 | from keras import metrics
14 |
15 | model.compile(loss='mean_squared_error',
16 | optimizer='sgd',
17 | metrics=[metrics.mae, metrics.categorical_accuracy])
18 | ```
19 |
20 | 评价函数和 [损失函数](/losses) 相似,只不过评价函数的结果不会用于训练过程中。
21 |
22 | 我们可以传递已有的评价函数名称,或者传递一个自定义的 Theano/TensorFlow 函数来使用(查阅[自定义评价函数](#custom-metrics))。
23 |
24 | __参数__
25 |
26 | - __y_true__: 真实标签,Theano/Tensorflow 张量。
27 | - __y_pred__: 预测值。和 y_true 相同尺寸的 Theano/TensorFlow 张量。
28 |
29 | __返回__
30 |
31 | 返回一个表示全部数据点平均值的张量。
32 |
33 | ----
34 |
35 | ## 可使用的评价函数
36 |
37 |
38 | ### accuracy
39 |
40 |
41 | ```python
42 | keras.metrics.accuracy(y_true, y_pred)
43 | ```
44 |
45 |
46 | ### binary_accuracy
47 |
48 |
49 | ```python
50 | keras.metrics.binary_accuracy(y_true, y_pred, threshold=0.5)
51 | ```
52 |
53 | ----
54 |
55 | ### categorical_accuracy
56 |
57 |
58 | ```python
59 | keras.metrics.categorical_accuracy(y_true, y_pred)
60 | ```
61 |
62 | ----
63 |
64 | ### sparse_categorical_accuracy
65 |
66 |
67 | ```python
68 | keras.metrics.sparse_categorical_accuracy(y_true, y_pred)
69 | ```
70 |
71 | ----
72 |
73 | ### top_k_categorical_accuracy
74 |
75 |
76 | ```python
77 | keras.metrics.top_k_categorical_accuracy(y_true, y_pred, k=5)
78 | ```
79 |
80 | ----
81 |
82 | ### sparse_top_k_categorical_accuracy
83 |
84 |
85 | ```python
86 | keras.metrics.sparse_top_k_categorical_accuracy(y_true, y_pred, k=5)
87 | ```
88 |
89 |
90 | ----
91 |
92 | ### cosine_proximity
93 |
94 |
95 | ```python
96 | keras.metrics.cosine_proximity(y_true, y_pred, axis=-1)
97 | ```
98 |
99 | ----
100 |
101 | ### clone_metric
102 |
103 |
104 | ```python
105 | keras.metrics.clone_metric(metric)
106 | ```
107 |
108 | 若有状态,返回评估指标的克隆,否则返回其本身。
109 |
110 |
111 | ----
112 |
113 | ### clone_metrics
114 |
115 |
116 | ```python
117 | keras.metrics.clone_metrics(metrics)
118 | ```
119 |
120 | 克隆给定的评估指标序列/字典。
121 |
122 | 除以上评估指标,你还可以使用在损失函数页描述的损失函数作为评估指标。
123 |
124 | ----
125 |
126 | ## 自定义评价函数
127 |
128 | 自定义评价函数应该在编译的时候(compile)传递进去。该函数需要以 `(y_true, y_pred)` 作为输入参数,并返回一个张量作为输出结果。
129 |
130 | ```python
131 | import keras.backend as K
132 |
133 | def mean_pred(y_true, y_pred):
134 | return K.mean(y_pred)
135 |
136 | model.compile(optimizer='rmsprop',
137 | loss='binary_crossentropy',
138 | metrics=['accuracy', mean_pred])
139 | ```
140 |
--------------------------------------------------------------------------------
/sources/models/about-keras-models.md:
--------------------------------------------------------------------------------
1 | # 关于 Keras 模型
2 |
3 | 在 Keras 中有两类主要的模型:[Sequential 顺序模型](/models/sequential) 和 [使用函数式 API 的 Model 类模型](/models/model)。
4 |
5 | 这些模型有许多共同的方法和属性:
6 |
7 | - `model.layers` 是包含模型网络层的展平列表。
8 | - `model.inputs` 是模型输入张量的列表。
9 | - `model.outputs` 是模型输出张量的列表。
10 | - `model.summary()` 打印出模型概述信息。 它是 [utils.print_summary](/utils/#print_summary) 的简捷调用。
11 | - `model.get_config()` 返回包含模型配置信息的字典。通过以下代码,就可以根据这些配置信息重新实例化模型:
12 |
13 | ```python
14 | config = model.get_config()
15 | model = Model.from_config(config)
16 | # 或者,对于 Sequential:
17 | model = Sequential.from_config(config)
18 | ```
19 |
20 | - `model.get_weights()` 返回模型中所有权重张量的列表,类型为 Numpy 数组。
21 | - `model.set_weights(weights)` 从 Numpy 数组中为模型设置权重。列表中的数组必须与 `get_weights()` 返回的权重具有相同的尺寸。
22 | - `model.to_json()` 以 JSON 字符串的形式返回模型的表示。请注意,该表示不包括权重,仅包含结构。你可以通过以下方式从 JSON 字符串重新实例化同一模型(使用重新初始化的权重):
23 |
24 | ```python
25 | from keras.models import model_from_json
26 |
27 | json_string = model.to_json()
28 | model = model_from_json(json_string)
29 | ```
30 |
31 | - `model.to_yaml()` 以 YAML 字符串的形式返回模型的表示。请注意,该表示不包括权重,只包含结构。你可以通过以下代码,从 YAML 字符串中重新实例化相同的模型(使用重新初始化的权重):
32 |
33 | ```python
34 | from keras.models import model_from_yaml
35 |
36 | yaml_string = model.to_yaml()
37 | model = model_from_yaml(yaml_string)
38 | ```
39 |
40 | - `model.save_weights(filepath)` 将模型权重存储为 HDF5 文件。
41 | - `model.load_weights(filepath, by_name=False)`: 从 HDF5 文件(由 `save_weights` 创建)中加载权重。默认情况下,模型的结构应该是不变的。 如果想将权重载入不同的模型(部分层相同), 设置 `by_name=True` 来载入那些名字相同的层的权重。
42 |
43 | 注意:另请参阅[如何安装 HDF5 或 h5py 以保存 Keras 模型](/getting-started/faq/#how-can-i-install-HDF5-or-h5py-to-save-my-models-in-Keras),在常见问题中了解如何安装 `h5py` 的说明。
44 |
45 | ## Model 类继承
46 |
47 | 除了这两类模型之外,你还可以通过继承 `Model` 类并在 `call` 方法中实现你自己的前向传播,以创建你自己的完全定制化的模型,(`Model` 类继承 API 引入于 Keras 2.2.0)。
48 |
49 | 这里是一个用 `Model` 类继承写的简单的多层感知器的例子:
50 |
51 | ```python
52 | import keras
53 |
54 | class SimpleMLP(keras.Model):
55 |
56 | def __init__(self, use_bn=False, use_dp=False, num_classes=10):
57 | super(SimpleMLP, self).__init__(name='mlp')
58 | self.use_bn = use_bn
59 | self.use_dp = use_dp
60 | self.num_classes = num_classes
61 |
62 | self.dense1 = keras.layers.Dense(32, activation='relu')
63 | self.dense2 = keras.layers.Dense(num_classes, activation='softmax')
64 | if self.use_dp:
65 | self.dp = keras.layers.Dropout(0.5)
66 | if self.use_bn:
67 | self.bn = keras.layers.BatchNormalization(axis=-1)
68 |
69 | def call(self, inputs):
70 | x = self.dense1(inputs)
71 | if self.use_dp:
72 | x = self.dp(x)
73 | if self.use_bn:
74 | x = self.bn(x)
75 | return self.dense2(x)
76 |
77 | model = SimpleMLP()
78 | model.compile(...)
79 | model.fit(...)
80 | ```
81 |
82 | 网络层定义在 `__init__(self, ...)` 中,前向传播在 `call(self, inputs)` 中指定。在 `call` 中,你可以指定自定义的损失函数,通过调用 `self.add_loss(loss_tensor)` (就像你在自定义层中一样)。
83 |
84 | 在类继承模型中,模型的拓扑结构是由 Python 代码定义的(而不是网络层的静态图)。这意味着该模型的拓扑结构不能被检查或序列化。因此,以下方法和属性**不适用于类继承模型**:
85 |
86 | - `model.inputs` 和 `model.outputs`。
87 | - `model.to_yaml()` 和 `model.to_json()`。
88 | - `model.get_config()` 和 `model.save()`。
89 |
90 | **关键点**:为每个任务使用正确的 API。`Model` 类继承 API 可以为实现复杂模型提供更大的灵活性,但它需要付出代价(比如缺失的特性):它更冗长,更复杂,并且有更多的用户错误机会。如果可能的话,尽可能使用函数式 API,这对用户更友好。
91 |
--------------------------------------------------------------------------------
/sources/optimizers.md:
--------------------------------------------------------------------------------
1 |
2 | ## 优化器的用法
3 |
4 | 优化器 (optimizer) 是编译 Keras 模型的所需的两个参数之一:
5 |
6 | ```python
7 | from keras import optimizers
8 |
9 | model = Sequential()
10 | model.add(Dense(64, kernel_initializer='uniform', input_shape=(10,)))
11 | model.add(Activation('softmax'))
12 |
13 | sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
14 | model.compile(loss='mean_squared_error', optimizer=sgd)
15 | ```
16 |
17 | 你可以先实例化一个优化器对象,然后将它传入 `model.compile()`,像上述示例中一样,
18 | 或者你可以通过名称来调用优化器。在后一种情况下,将使用优化器的默认参数。
19 |
20 |
21 | ```python
22 | # 传入优化器名称: 默认参数将被采用
23 | model.compile(loss='mean_squared_error', optimizer='sgd')
24 | ```
25 |
26 | ---
27 |
28 | ## Keras 优化器的公共参数
29 |
30 |
31 | 参数 `clipnorm` 和 `clipvalue` 能在所有的优化器中使用,用于控制梯度裁剪(Gradient Clipping):
32 |
33 | ```python
34 | from keras import optimizers
35 |
36 | # 所有参数梯度将被裁剪,让其 l2 范数最大为 1:g * 1 / max(1, l2_norm)
37 | sgd = optimizers.SGD(lr=0.01, clipnorm=1.)
38 | ```
39 |
40 | ```python
41 | from keras import optimizers
42 |
43 | # 所有参数 d 梯度将被裁剪到数值范围内:
44 | # 最大值 0.5
45 | # 最小值 -0.5
46 | sgd = optimizers.SGD(lr=0.01, clipvalue=0.5)
47 | ```
48 |
49 | ---
50 |
51 | [[source]](https://github.com/keras-team/keras/blob/master/keras/optimizers.py#L164)
52 | ### SGD
53 |
54 | ```python
55 | keras.optimizers.SGD(learning_rate=0.01, momentum=0.0, nesterov=False)
56 | ```
57 |
58 | 随机梯度下降优化器。
59 |
60 | 包含扩展功能的支持:
61 |
62 | - 动量(momentum)优化,
63 | - 学习率衰减(每次参数更新后)
64 | - Nestrov 动量 (NAG) 优化
65 |
66 | __参数__
67 |
68 | - __learning_rate__: float >= 0. 学习率。
69 | - __momentum__: float >= 0. 参数,用于加速 SGD 在相关方向上前进,并抑制震荡。
70 | - __nesterov__: boolean. 是否使用 Nesterov 动量。
71 |
72 | ----
73 |
74 | [[source]](https://github.com/keras-team/keras/blob/master/keras/optimizers.py#L229)
75 | ### RMSprop
76 |
77 | ```python
78 | keras.optimizers.RMSprop(learning_rate=0.001, rho=0.9)
79 | ```
80 |
81 | RMSProp 优化器。
82 |
83 | 建议使用优化器的默认参数
84 | (除了学习率,它可以被自由调节)
85 |
86 |
87 | 这个优化器通常是训练循环神经网络 RNN 的不错选择。
88 |
89 | __参数__
90 |
91 | - __learning_rate__: float >= 0. 学习率。
92 | - __rho__: float >= 0. RMSProp 梯度平方的移动均值的衰减率。
93 |
94 | __参考文献__
95 |
96 | - [rmsprop: Divide the gradient by a running average of its recent magnitude](http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf)
97 |
98 | ----
99 |
100 | [[source]](https://github.com/keras-team/keras/blob/master/keras/optimizers.py#L303)
101 | ### Adagrad
102 |
103 | ```python
104 | keras.optimizers.Adagrad(learning_rate=0.01)
105 | ```
106 |
107 | Adagrad 优化器。
108 |
109 | Adagrad 是一种具有特定参数学习率的优化器,它根据参数在训练期间的更新频率进行自适应调整。参数接收的更新越多,更新越小。
110 |
111 | 建议使用优化器的默认参数。
112 |
113 | __参数__
114 |
115 | - __learning_rate__: float >= 0. 学习率。
116 |
117 | __参考文献__
118 |
119 | - [Adaptive Subgradient Methods for Online Learning and Stochastic Optimization](http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf)
120 |
121 | ----
122 |
123 | [[source]](https://github.com/keras-team/keras/blob/master/keras/optimizers.py#L376)
124 | ### Adadelta
125 |
126 | ```python
127 | keras.optimizers.Adadelta(learning_rate=1.0, rho=0.95)
128 | ```
129 |
130 | Adadelta 优化器。
131 |
132 | Adadelta 是 Adagrad 的一个具有更强鲁棒性的的扩展版本,它不是累积所有过去的梯度,而是根据渐变更新的移动窗口调整学习速率。
133 | 这样,即使进行了许多更新,Adadelta 仍在继续学习。 与 Adagrad 相比,在 Adadelta 的原始版本中,您无需设置初始学习率。
134 | 在此版本中,与大多数其他 Keras 优化器一样,可以设置初始学习速率和衰减因子。
135 |
136 | 建议使用优化器的默认参数。
137 |
138 | __参数__
139 |
140 | - __learning_rate__: float >= 0. 初始学习率,默认为 1。建议保留默认值。
141 | - __rho__: float >= 0. Adadelta 梯度平方移动均值的衰减率。
142 |
143 | __参考文献__
144 |
145 | - [Adadelta - an adaptive learning rate method](http://arxiv.org/abs/1212.5701)
146 |
147 | ----
148 |
149 | [[source]](https://github.com/keras-team/keras/blob/master/keras/optimizers.py#L467)
150 | ### Adam
151 |
152 | ```python
153 | keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)
154 | ```
155 |
156 | Adam 优化器。
157 |
158 | 默认参数遵循原论文中提供的值。
159 |
160 |
161 | __参数__
162 |
163 | - __learning_rate__: float >= 0. 学习率。
164 | - __beta_1__: float, 0 < beta < 1. 通常接近于 1。
165 | - __beta_2__: float, 0 < beta < 1. 通常接近于 1。
166 | - __amsgrad__: boolean. 是否应用此算法的 AMSGrad 变种,来自论文 "On the Convergence of Adam and Beyond"。
167 |
168 | __参考文献__
169 |
170 | - [Adam - A Method for Stochastic Optimization](http://arxiv.org/abs/1412.6980v8)
171 | - [On the Convergence of Adam and Beyond](https://openreview.net/forum?id=ryQu7f-RZ)
172 |
173 | ----
174 |
175 | [[source]](https://github.com/keras-team/keras/blob/master/keras/optimizers.py#L567)
176 | ### Adamax
177 |
178 | ```python
179 | keras.optimizers.Adamax(learning_rate=0.002, beta_1=0.9, beta_2=0.999)
180 | ```
181 |
182 | Adamax 优化器,来自 Adam 论文的第七小节.
183 |
184 | 它是Adam算法基于无穷范数(infinity norm)的变种。
185 | 默认参数遵循论文中提供的值。
186 |
187 | __参数__
188 |
189 | - __learning_rate__: float >= 0. 学习率。
190 | - __beta_1__: floats, 0 < beta < 1. 通常接近于 1。
191 | - __beta_2__: floats, 0 < beta < 1. 通常接近于 1。
192 |
193 | __参考文献__
194 |
195 | - [Adam - A Method for Stochastic Optimization](http://arxiv.org/abs/1412.6980v8)
196 |
197 | ----
198 |
199 | [[source]](https://github.com/keras-team/keras/blob/master/keras/optimizers.py#L645)
200 | ### Nadam
201 |
202 | ```python
203 | keras.optimizers.Nadam(learning_rate=0.002, beta_1=0.9, beta_2=0.999)
204 | ```
205 |
206 | Nesterov 版本 Adam 优化器。
207 |
208 | 正像 Adam 本质上是 RMSProp 与动量 momentum 的结合,
209 | Nadam 是采用 Nesterov momentum 版本的 Adam 优化器。
210 |
211 | 默认参数遵循论文中提供的值。
212 | 建议使用优化器的默认参数。
213 |
214 |
215 | __参数__
216 |
217 | - __learning_rate__: float >= 0. 学习率。
218 | - __beta_1__: floats, 0 < beta < 1. 通常接近于 1。
219 | - __beta_2__: floats, 0 < beta < 1. 通常接近于 1。
220 |
221 | __参考文献__
222 |
223 | - [Nadam report](http://cs229.stanford.edu/proj2015/054_report.pdf)
224 | - [On the importance of initialization and momentum in deep learning](http://www.cs.toronto.edu/~fritz/absps/momentum.pdf)
225 |
--------------------------------------------------------------------------------
/sources/preprocessing/sequence.md:
--------------------------------------------------------------------------------
1 | [[source]](https://github.com/keras-team/keras/blob/master/keras/preprocessing/sequence.py#L16)
2 | ### TimeseriesGenerator
3 |
4 | ```python
5 | keras.preprocessing.sequence.TimeseriesGenerator(data, targets, length, sampling_rate=1, stride=1, start_index=0, end_index=None, shuffle=False, reverse=False, batch_size=128)
6 | ```
7 |
8 | 用于生成批量时序数据的实用工具类。
9 |
10 | 这个类以一系列由相等间隔以及一些时间序列参数(例如步长、历史长度等)汇集的数据点作为输入,以生成用于训练/验证的批次数据。
11 |
12 | __参数__
13 |
14 | - __data__: 可索引的生成器(例如列表或 Numpy 数组),包含连续数据点(时间步)。数据应该是 2D 的,且第 0 个轴为时间维度。
15 | - __targets__: 对应于 `data` 的时间步的目标值。它应该与 `data` 的长度相同。
16 | - __length__: 输出序列的长度(以时间步数表示)。
17 | - __sampling_rate__: 序列内连续各个时间步之间的周期。对于周期 `r`, 时间步 `data[i]`, `data[i-r]`, ... `data[i - length]` 被用于生成样本序列。
18 | - __stride__: 连续输出序列之间的周期. 对于周期 `s`, 连续输出样本将为 `data[i]`, `data[i+s]`, `data[i+2*s]` 等。
19 | - __start_index__: 在 `start_index` 之前的数据点在输出序列中将不被使用。这对保留部分数据以进行测试或验证很有用。
20 | - __end_index__: 在 `end_index` 之后的数据点在输出序列中将不被使用。这对保留部分数据以进行测试或验证很有用。
21 | - __shuffle__: 是否打乱输出样本,还是按照时间顺序绘制它们。
22 | - __reverse__: 布尔值: 如果 `true`, 每个输出样本中的时间步将按照时间倒序排列。
23 | - __batch_size__: 每个批次中的时间序列样本数(可能除最后一个外)。
24 |
25 | __返回__
26 |
27 | 一个 [Sequence](https://keras.io/zh/utils/#sequence) 实例。
28 |
29 | __示例__
30 |
31 | ```python
32 | from keras.preprocessing.sequence import TimeseriesGenerator
33 | import numpy as np
34 |
35 | data = np.array([[i] for i in range(50)])
36 | targets = np.array([[i] for i in range(50)])
37 |
38 | data_gen = TimeseriesGenerator(data, targets,
39 | length=10, sampling_rate=2,
40 | batch_size=2)
41 | assert len(data_gen) == 20
42 |
43 | batch_0 = data_gen[0]
44 | x, y = batch_0
45 | assert np.array_equal(x,
46 | np.array([[[0], [2], [4], [6], [8]],
47 | [[1], [3], [5], [7], [9]]]))
48 | assert np.array_equal(y,
49 | np.array([[10], [11]]))
50 | ```
51 |
52 | ---
53 |
54 | ### pad_sequences
55 |
56 |
57 | ```python
58 | keras.preprocessing.sequence.pad_sequences(sequences, maxlen=None, dtype='int32', padding='pre', truncating='pre', value=0.0)
59 | ```
60 |
61 | 将多个序列截断或补齐为相同长度。
62 |
63 | 该函数将一个 `num_samples` 的序列(整数列表)转化为一个 2D Numpy 矩阵,其尺寸为 `(num_samples, num_timesteps)`。 `num_timesteps` 要么是给定的 `maxlen` 参数,要么是最长序列的长度。
64 |
65 | 比 `num_timesteps` 短的序列将在末端以 `value` 值补齐。
66 |
67 | 比 `num_timesteps` 长的序列将会被截断以满足所需要的长度。补齐或截断发生的位置分别由参数 `pading` 和 `truncating` 决定。
68 |
69 | 向前补齐为默认操作。
70 |
71 | __参数__
72 |
73 | - __sequences__: 列表的列表,每一个元素是一个序列。
74 | - __maxlen__: 整数,所有序列的最大长度。
75 | - __dtype__: 输出序列的类型。
76 | 要使用可变长度字符串填充序列,可以使用 `object`。
77 | - __padding__: 字符串,'pre' 或 'post' ,在序列的前端补齐还是在后端补齐。
78 | - __truncating__: 字符串,'pre' 或 'post' ,移除长度大于 `maxlen` 的序列的值,要么在序列前端截断,要么在后端。
79 | - __value__: 浮点数,表示用来补齐的值。
80 |
81 |
82 | __返回__
83 |
84 | - __x__: Numpy 矩阵,尺寸为 `(len(sequences), maxlen)`。
85 |
86 | __异常__
87 |
88 | - ValueError: 如果截断或补齐的值无效,或者序列条目的形状无效。
89 |
90 | ---
91 |
92 | ### skipgrams
93 |
94 |
95 | ```python
96 | keras.preprocessing.sequence.skipgrams(sequence, vocabulary_size, window_size=4, negative_samples=1.0, shuffle=True, categorical=False, sampling_table=None, seed=None)
97 | ```
98 |
99 | 生成 skipgram 词对。
100 |
101 | 该函数将一个单词索引序列(整数列表)转化为以下形式的单词元组:
102 |
103 | - (单词, 同窗口的单词),标签为 1(正样本)。
104 | - (单词, 来自词汇表的随机单词),标签为 0(负样本)。
105 |
106 | 若要了解更多和 Skipgram 有关的知识,请参阅这份由 Mikolov 等人发表的经典论文: [Efficient Estimation of Word Representations in Vector Space](http://arxiv.org/pdf/1301.3781v3.pdf)
107 |
108 | __参数__
109 |
110 | - __sequence__: 一个编码为单词索引(整数)列表的词序列(句子)。如果使用一个 `sampling_table`,词索引应该以一个相关数据集的词的排名匹配(例如,10 将会编码为第 10 个最长出现的词)。注意词汇表中的索引 0 是非单词,将被跳过。
111 | - __vocabulary_size__: 整数,最大可能词索引 + 1
112 | - __window_size__: 整数,采样窗口大小(技术上是半个窗口)。词 `w_i` 的窗口是 `[i - window_size, i + window_size+1]`。
113 | - __negative_samples__: 大于等于 0 的浮点数。0 表示非负(即随机)采样。1 表示与正样本数相同。
114 | - __shuffle__: 是否在返回之前将这些词语打乱。
115 | - __categorical__: 布尔值。如果 False,标签将为整数(例如 `[0, 1, 1 .. ]`),如果 True,标签将为分类,例如 `[[1,0],[0,1],[0,1] .. ]`。
116 | - __sampling_table__: 尺寸为 `vocabulary_size` 的 1D 数组,其中第 i 项编码了排名为 i 的词的采样概率。
117 | - __seed__: 随机种子。
118 |
119 | __返回__
120 |
121 | couples, labels: 其中 `couples` 是整数对,`labels` 是 0 或 1。
122 |
123 | __注意__
124 |
125 | 按照惯例,词汇表中的索引 0 是非单词,将被跳过。
126 |
127 | ---
128 |
129 | ### make_sampling_table
130 |
131 |
132 | ```python
133 | keras.preprocessing.sequence.make_sampling_table(size, sampling_factor=1e-05)
134 | ```
135 |
136 |
137 | 生成一个基于单词的概率采样表。
138 |
139 | 用来生成 `skipgrams` 的 `sampling_table` 参数。`sampling_table[i]` 是数据集中第 i 个最常见词的采样概率(出于平衡考虑,出现更频繁的词应该被更少地采样)。
140 |
141 | 采样概率根据 word2vec 中使用的采样分布生成:
142 |
143 | ```python
144 | p(word) = (min(1, sqrt(word_frequency / sampling_factor) /
145 | (word_frequency / sampling_factor)))
146 | ```
147 |
148 | 我们假设单词频率遵循 Zipf 定律(s=1),来导出 frequency(rank) 的数值近似:
149 |
150 | `frequency(rank) ~ 1/(rank * (log(rank) + gamma) + 1/2 - 1/(12*rank))`,其中 `gamma` 为 Euler-Mascheroni 常量。
151 |
152 | __参数__
153 |
154 | - __size__: 整数,可能采样的单词数量。
155 | - __sampling_factor__: word2vec 公式中的采样因子。
156 |
157 | __返回__
158 |
159 | 一个长度为 `size` 大小的 1D Numpy 数组,其中第 i 项是排名为 i 的单词的采样概率。
160 |
--------------------------------------------------------------------------------
/sources/preprocessing/text.md:
--------------------------------------------------------------------------------
1 |
2 | ### Text Preprocessing
3 |
4 | [[source]](https://github.com/keras-team/keras/blob/master/keras/preprocessing/text.py#L139)
5 | ### Tokenizer
6 |
7 | ```python
8 | keras.preprocessing.text.Tokenizer(num_words=None,
9 | filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n',
10 | lower=True,
11 | split=' ',
12 | char_level=False,
13 | oov_token=None,
14 | document_count=0)
15 | ```
16 |
17 | 文本标记实用类。
18 |
19 | 该类允许使用两种方法向量化一个文本语料库:
20 | 将每个文本转化为一个整数序列(每个整数都是词典中标记的索引);
21 | 或者将其转化为一个向量,其中每个标记的系数可以是二进制值、词频、TF-IDF 权重等。
22 |
23 | __参数__
24 |
25 | - __num_words__: 需要保留的最大词数,基于词频。只有最常出现的 `num_words-1` 词会被保留。
26 | - __filters__: 一个字符串,其中每个元素是一个将从文本中过滤掉的字符。默认值是所有标点符号,加上制表符和换行符,减去 `'` 字符。
27 | - __lower__: 布尔值。是否将文本转换为小写。
28 | - __split__: 字符串。按该字符串切割文本。
29 | - __char_level__: 如果为 True,则每个字符都将被视为标记。
30 | - __oov_token__: 如果给出,它将被添加到 word_index 中,并用于在 `text_to_sequence` 调用期间替换词汇表外的单词。
31 |
32 | 默认情况下,删除所有标点符号,将文本转换为空格分隔的单词序列(单词可能包含 `'` 字符)。
33 | 这些序列然后被分割成标记列表。然后它们将被索引或向量化。
34 |
35 | `0` 是不会被分配给任何单词的保留索引。
36 |
37 |
38 | ----
39 |
40 | ### hashing_trick
41 |
42 |
43 | ```python
44 | keras.preprocessing.text.hashing_trick(text,
45 | n,
46 | hash_function=None,
47 | filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n',
48 | lower=True,
49 | split=' ')
50 | ```
51 |
52 |
53 | 将文本转换为固定大小散列空间中的索引序列。
54 |
55 | __参数__
56 |
57 | - __text__: 输入文本(字符串)。
58 | - __n__: 散列空间维度。
59 | - __hash_function__: 默认为 python 散列函数,可以是 'md5' 或任意接受输入字符串并返回整数的函数。注意 'hash' 不是稳定的散列函数,所以它在不同的运行中不一致,而 'md5' 是一个稳定的散列函数。
60 | - __filters__: 要过滤的字符列表(或连接),如标点符号。默认:``!"#$%&()*+,-./:;<=>?@[\]^_`{|}~\t\n``,包含基本标点符号,制表符和换行符。
61 | - __lower__: 布尔值。是否将文本转换为小写。
62 | - __split__: 字符串。按该字符串切割文本。
63 |
64 | __返回__
65 |
66 | 整数词索引列表(唯一性无法保证)。
67 |
68 | `0` 是不会被分配给任何单词的保留索引。
69 |
70 | 由于哈希函数可能发生冲突,可能会将两个或更多字分配给同一索引。
71 | 碰撞的[概率](https://en.wikipedia.org/wiki/Birthday_problem#Probability_table)与散列空间的维度和不同对象的数量有关。
72 |
73 |
74 | ----
75 |
76 | ### one_hot
77 |
78 |
79 | ```python
80 | keras.preprocessing.text.one_hot(text,
81 | n,
82 | filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n',
83 | lower=True,
84 | split=' ')
85 | ```
86 |
87 | One-hot 将文本编码为大小为 n 的单词索引列表。
88 |
89 | 这是 `hashing_trick` 函数的一个封装,
90 | 使用 `hash` 作为散列函数;单词索引映射无保证唯一性。
91 |
92 | __参数__
93 |
94 | - __text__: 输入文本(字符串)。
95 | - __n__: 整数。词汇表尺寸。
96 | - __filters__: 要过滤的字符列表(或连接),如标点符号。默认:``!"#$%&()*+,-./:;<=>?@[\]^_`{|}~\t\n``,包含基本标点符号,制表符和换行符。
97 | - __lower__: 布尔值。是否将文本转换为小写。
98 | - __split__: 字符串。按该字符串切割文本。
99 |
100 | __返回__
101 |
102 | [1, n] 之间的整数列表。每个整数编码一个词(唯一性无法保证)。
103 |
104 |
105 | ----
106 |
107 |
108 | ### text_to_word_sequence
109 |
110 |
111 | ```python
112 | keras.preprocessing.text.text_to_word_sequence(text,
113 | filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n',
114 | lower=True,
115 | split=' ')
116 | ```
117 |
118 | 将文本转换为单词(或标记)的序列。
119 |
120 | __参数__
121 |
122 | - __text__: 输入文本(字符串)。
123 | - __filters__: 要过滤的字符列表(或连接),如标点符号。默认:``!"#$%&()*+,-./:;<=>?@[\]^_`{|}~\t\n``,包含基本标点符号,制表符和换行符。
124 | - __lower__: 布尔值。是否将文本转换为小写。
125 | - __split__: 字符串。按该字符串切割文本。
126 |
127 | __返回__
128 |
129 | 词或标记的列表。
130 |
--------------------------------------------------------------------------------
/sources/regularizers.md:
--------------------------------------------------------------------------------
1 | ## 正则化器的使用
2 |
3 | 正则化器允许在优化过程中对层的参数或层的激活情况进行惩罚。 网络优化的损失函数也包括这些惩罚项。
4 |
5 | 惩罚是以层为对象进行的。具体的 API 因层而异,但 `Dense`,`Conv1D`,`Conv2D` 和 `Conv3D` 这些层具有统一的 API。
6 |
7 | 正则化器开放 3 个关键字参数:
8 |
9 | - `kernel_regularizer`: `keras.regularizers.Regularizer` 的实例
10 | - `bias_regularizer`: `keras.regularizers.Regularizer` 的实例
11 | - `activity_regularizer`: `keras.regularizers.Regularizer` 的实例
12 |
13 |
14 | ## 示例
15 |
16 | ```python
17 | from keras import regularizers
18 | model.add(Dense(64, input_dim=64,
19 | kernel_regularizer=regularizers.l2(0.01),
20 | activity_regularizer=regularizers.l1(0.01)))
21 | ```
22 |
23 | ## 可用的正则化器
24 |
25 | ```python
26 | keras.regularizers.l1(0.)
27 | keras.regularizers.l2(0.)
28 | keras.regularizers.l1_l2(l1=0.01, l2=0.01)
29 | ```
30 |
31 | ## 开发新的正则化器
32 |
33 | 任何输入一个权重矩阵、返回一个损失贡献张量的函数,都可以用作正则化器,例如:
34 |
35 | ```python
36 | from keras import backend as K
37 |
38 | def l1_reg(weight_matrix):
39 | return 0.01 * K.sum(K.abs(weight_matrix))
40 |
41 | model.add(Dense(64, input_dim=64,
42 | kernel_regularizer=l1_reg))
43 | ```
44 |
45 | 另外,你也可以用面向对象的方式来编写正则化器的代码,例子见 [keras/regularizers.py](https://github.com/keras-team/keras/blob/master/keras/regularizers.py) 模块。
46 |
--------------------------------------------------------------------------------
/sources/scikit-learn-api.md:
--------------------------------------------------------------------------------
1 | # Scikit-Learn API 的封装器
2 |
3 | 你可以使用 Keras 的 `Sequential` 模型(仅限单一输入)作为 Scikit-Learn 工作流程的一部分,通过在此找到的包装器: `keras.wrappers.scikit_learn.py`。
4 |
5 | 有两个封装器可用:
6 |
7 | `keras.wrappers.scikit_learn.KerasClassifier(build_fn=None, **sk_params)`, 这实现了Scikit-Learn 分类器接口,
8 |
9 | `keras.wrappers.scikit_learn.KerasRegressor(build_fn=None, **sk_params)`, 这实现了Scikit-Learn 回归接口。
10 |
11 | ### 参数
12 |
13 | - __build_fn__: 可调用函数或类实例
14 | - __sk_params__: 模型参数和拟合参数
15 |
16 | `build_fn` 应该建立,编译,并返回一个 Keras 模型,然后被用来训练/预测。以下三个值之一可以传递给`build_fn`
17 |
18 | 1. 一个函数;
19 | 2. 实现 `__call__` 方法的类的实例;
20 | 3. None。这意味着你实现了一个继承自 `KerasClassifier` 或 `KerasRegressor` 的类。当前类 `__call__` 方法将被视为默认的 `build_fn`。
21 |
22 | `sk_params` 同时包含模型参数和拟合参数。合法的模型参数是 `build_fn` 的参数。请注意,与 scikit-learn 中的所有其他估算器一样,`build_fn` 应为其参数提供默认值,
23 | 以便你可以创建估算器而不将任何值传递给 `sk_params`。
24 |
25 | `sk_params` 还可以接受用于调用 `fit`,`predict`,`predict_proba` 和 `score` 方法的参数(例如,`epochs`,`batch_size`)。训练(预测)参数按以下顺序选择:
26 |
27 | 1. 传递给 `fit`,`predict`,`predict_proba` 和 `score` 函数的字典参数的值;
28 | 2. 传递给 `sk_params` 的值;
29 | 3. `keras.models.Sequential` 的 `fit`,`predict`,`predict_proba` 和 `score` 方法的默认值。
30 |
31 | 当使用 scikit-learn 的 `grid_search` API 时,合法可调参数是你可以传递给 `sk_params` 的参数,包括训练参数。换句话说,你可以使用 `grid_search` 来搜索最佳的 `batch_size` 或 `epoch` 以及其他模型参数。
32 |
--------------------------------------------------------------------------------
/sources/visualization.md:
--------------------------------------------------------------------------------
1 |
2 | ## 模型可视化
3 |
4 | `keras.utils.vis_utils` 模块提供了一些绘制 Keras 模型的实用功能(使用 `graphviz`)。
5 |
6 | 以下实例,将绘制一张模型图,并保存为文件:
7 | ```python
8 | from keras.utils import plot_model
9 | plot_model(model, to_file='model.png')
10 | ```
11 |
12 | `plot_model` 有 4 个可选参数:
13 |
14 | - `show_shapes` (默认为 False) 控制是否在图中输出各层的尺寸。
15 | - `show_layer_names` (默认为 True) 控制是否在图中显示每一层的名字。
16 | - `expand_dim`(默认为 False)控制是否将嵌套模型扩展为图形中的聚类。
17 | - `dpi`(默认为 96)控制图像 dpi。
18 |
19 | 此外,你也可以直接取得 `pydot.Graph` 对象并自己渲染它。
20 | 例如,ipython notebook 中的可视化实例如下:
21 |
22 | ```python
23 | from IPython.display import SVG
24 | from keras.utils.vis_utils import model_to_dot
25 |
26 | SVG(model_to_dot(model).create(prog='dot', format='svg'))
27 | ```
28 |
29 | ----
30 |
31 | ## 训练历史可视化
32 |
33 | Keras `Model` 上的 `fit()` 方法返回一个 `History` 对象。`History.history` 属性是一个记录了连续迭代的训练/验证(如果存在)损失值和评估值的字典。这里是一个简单的使用 `matplotlib` 来生成训练/验证集的损失和准确率图表的例子:
34 |
35 | ```python
36 | import matplotlib.pyplot as plt
37 |
38 | history = model.fit(x, y, validation_split=0.25, epochs=50, batch_size=16, verbose=1)
39 |
40 | # 绘制训练 & 验证的准确率值
41 | plt.plot(history.history['acc'])
42 | plt.plot(history.history['val_acc'])
43 | plt.title('Model accuracy')
44 | plt.ylabel('Accuracy')
45 | plt.xlabel('Epoch')
46 | plt.legend(['Train', 'Test'], loc='upper left')
47 | plt.show()
48 |
49 | # 绘制训练 & 验证的损失值
50 | plt.plot(history.history['loss'])
51 | plt.plot(history.history['val_loss'])
52 | plt.title('Model loss')
53 | plt.ylabel('Loss')
54 | plt.xlabel('Epoch')
55 | plt.legend(['Train', 'Test'], loc='upper left')
56 | plt.show()
57 | ```
58 |
--------------------------------------------------------------------------------
/sources/why-use-keras.md:
--------------------------------------------------------------------------------
1 | # 为什么选择 Keras?
2 |
3 | 在如今无数深度学习框架中,为什么要使用 Keras 而非其他?以下是 Keras 与现有替代品的一些比较。
4 |
5 | ---
6 |
7 | ## Keras 优先考虑开发人员的经验
8 |
9 | - Keras 是为人类而非机器设计的 API。[Keras 遵循减少认知困难的最佳实践](https://blog.keras.io/user-experience-design-for-apis.html): 它提供一致且简单的 API,它将常见用例所需的用户操作数量降至最低,并且在用户错误时提供清晰和可操作的反馈。
10 |
11 | - 这使 Keras 易于学习和使用。作为 Keras 用户,你的工作效率更高,能够比竞争对手更快地尝试更多创意,从而[帮助你赢得机器学习竞赛](https://www.quora.com/Why-has-Keras-been-so-successful-lately-at-Kaggle-competitions)。
12 |
13 | - 这种易用性并不以降低灵活性为代价:因为 Keras 与底层深度学习语言(特别是 TensorFlow)集成在一起,所以它可以让你实现任何你可以用基础语言编写的东西。特别是,`tf.keras` 作为 Keras API 可以与 TensorFlow 工作流无缝集成。
14 |
15 | ---
16 |
17 | ## Keras 被工业界和学术界广泛采用
18 |
19 |
20 |
21 |
22 | Deep learning 框架排名,由 Jeff Hale 基于 7 个分类的 11 个数据源计算得出
23 |
24 |
25 |
26 | 截至 2018 年中期,Keras 拥有超过 250,000 名个人用户。与其他任何深度学习框架相比,Keras 在行业和研究领域的应用率更高(除 TensorFlow 之外,且 Keras API 是 TensorFlow 的官方前端,通过 `tf.keras` 模块使用)。
27 |
28 | 你已经不断与使用 Keras 构建的功能进行交互 - 它在 Netflix, Uber, Yelp, Instacart, Zocdoc, Square 等众多网站上被使用。它尤其受以深度学习作为产品核心的创业公司的欢迎。
29 |
30 | Keras 也是深度学习研究人员的最爱,在上传到预印本服务器 [arXiv.org](https://arxiv.org/archive/cs) 的科学论文中被提及的次数位居第二。Keras 还被大型科学组织的研究人员采用,特别是 CERN 和 NASA。
31 |
32 | ---
33 |
34 | ## Keras 可以轻松将模型转化为产品
35 |
36 | 与任何其他深度学习框架相比,你的 Keras 模型可以轻松地部署在更广泛的平台上:
37 |
38 | - 在 iOS 上,通过 [Apple’s CoreML](https://developer.apple.com/documentation/coreml)(苹果为 Keras 提供官方支持)。这里有一个[教程](https://www.pyimagesearch.com/2018/04/23/running-keras-models-on-ios-with-coreml/)。
39 | - 在 Android 上,通过 TensorFlow Android runtime。例如 [Not Hotdog app](https://medium.com/@timanglade/how-hbos-silicon-valley-built-not-hotdog-with-mobile-tensorflow-keras-react-native-ef03260747f3)。
40 | - 在浏览器中,通过 GPU 加速的 JavaScript 运行时,例如 [Keras.js](https://transcranial.github.io/keras-js/#/) 和 [WebDNN](https://mil-tokyo.github.io/webdnn/)。
41 | - 在 Google Cloud 上,通过 [TensorFlow-Serving](https://www.tensorflow.org/serving/)。
42 | - [在 Python webapp 后端中(比如 Flask app)](https://blog.keras.io/building-a-simple-keras-deep-learning-rest-api.html)。
43 | - 在 JVM 上,通过 [SkyMind 提供的 DL4J 模型导入](https://deeplearning4j.org/model-import-keras)。
44 | - 在 Raspberry Pi 树莓派上。
45 |
46 | ---
47 |
48 | ## Keras 支持多个后端引擎,不会将你锁定到一个生态系统中
49 |
50 | 你的 Keras 模型可以基于不同的[深度学习后端](https://keras.io/zh/backend/)开发。重要的是,任何仅利用内置层构建的 Keras 模型,都可以在所有这些后端中移植:你可以用一种后端训练模型,再将它载入另一种后端中(例如为了发布的需要)。支持的后端有:
51 |
52 | - 谷歌的 TensorFlow 后端
53 | - 微软的 CNTK 后端
54 | - Theano 后端
55 |
56 | 亚马逊也有一个[使用 MXNet 作为后端的 Keras 分支](https://github.com/awslabs/keras-apache-mxnet)。
57 |
58 | 如此一来,你的 Keras 模型可以在 CPU 之外的不同硬件平台上训练:
59 |
60 | - [NVIDIA GPUs](https://developer.nvidia.com/deep-learning)
61 | - [Google TPUs](https://cloud.google.com/tpu/),通过 TensorFlow 后端和 Google Cloud
62 | - OpenCL 支持的 GPUs,比如 AMD, 通过 [PlaidML Keras 后端](https://github.com/plaidml/plaidml)
63 |
64 | ---
65 |
66 | ## Keras 拥有强大的多 GPU 和分布式训练支持
67 |
68 | - Keras [内置对多 GPU 数据并行的支持](https://keras.io/zh/utils/#multi_gpu_model)。
69 | - 优步的 [Horovod](https://github.com/uber/horovod) 对 Keras 模型拥有一流的支持。
70 | - Keras 模型[可以被转换为 TensorFlow Estimators](https://www.tensorflow.org/versions/master/api_docs/python/tf/keras/estimator/model_to_estimator) 并在 [Google Cloud 的 GPU 集群](https://cloud.google.com/solutions/running-distributed-tensorflow-on-compute-engine)上训练。
71 | - Keras 可以在 Spark(通过 CERN 的 [Dist-Keras](https://github.com/cerndb/dist-keras))和 [Elephas](https://github.com/maxpumperla/elephas) 上运行。
72 |
73 | ---
74 |
75 | ## Keras 的发展得到深度学习生态系统中的关键公司的支持
76 |
77 | Keras 的开发主要由谷歌支持,Keras API 以 `tf.keras` 的形式包装在 TensorFlow 中。此外,微软维护着 Keras 的 CNTK 后端。亚马逊 AWS 正在开发 MXNet 支持。其他提供支持的公司包括 NVIDIA、优步、苹果(通过 CoreML)等。
78 |
79 |
80 |
81 |
82 |
83 |
--------------------------------------------------------------------------------