Python深度学习-Keras总结

你应该熟悉以下三种网络架构:密集连接网络、卷积网络和循环网络。每种类型的网络都针对于特定的输入模式,网络架构(密集网络、卷积网络、循环网络)中包含对数据结构的假设,即搜索良好模型所在的假设空间

1. 密集连接网络

对于二分类问题(binary classification),层堆叠的最后一层是使用 sigmoid 激活
且只有一个单元的 Dense 层,并使用 binary_crossentropy 作为损失。目标应该是 0 或 1。

from keras import models
from keras import layers
model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape=(num_input_features,)))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy')

对于单标签多分类问题(single-label categorical classification,每个样本只有一个类别,不会超过一个),层堆叠的最后一层是一个 Dense 层,它使用 softmax 激活,其单元个数等于类别个数。如果目标是 one-hot 编码的,那么使用 categorical_crossentropy 作为损失;如果目标是整数,那么使用 sparse_categorical_crossentropy 作为损失。

model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape=(num_input_features,)))
model.add(layers.Dense(32, activation='relu')) 
model.add(layers.Dense(num_classes, activation='softmax'))
model.compile(optimizer='rmsprop', loss='categorical_crossentropy')

对于多标签多分类问题(multilabel categorical classification,每个样本可以有多个类别),层堆叠的最后一层是一个 Dense 层,它使用 sigmoid 激活,其单元个数等于类别个数,并使用 binary_crossentropy 作为损失。目标应该是 k-hot 编码的。

model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape=(num_input_features,))) 
model.add(layers.Dense(32, activation='relu')) 
model.add(layers.Dense(num_classes, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy')

对于连续值向量的回归(regression)问题,层堆叠的最后一层是一个不带激活 Dense 层,其单元个数等于你要预测的值的个数(通常只有一个值,比如房价)。有几种损失可用于回归问题,最常见的是 mean_squared_error(均方误差,MSE)和 mean_absolute_error(平均绝对误差,MAE)。

model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape=(num_input_features,)))
model.add(layers.Dense(32, activation='relu')) 
model.add(layers.Dense(num_values))
model.compile(optimizer='rmsprop', loss='mse')

2. 卷积神经网络

大部分(或者全部)普通卷积很可能不久后会被深度可分离卷积(depthwise separable convolution,SeparableConv2D 层)所替代,后者与前者等效,但速度更快、表示效率更高。对于三维、二维和一维的输入来说都是如此。如果你从头开始构建一个新网络,那么一定要使用深度可分离卷积。SeparableConv2D 层可直接替代 Conv2D 层,得到一个更小、更快的网络,在任务上的表现也更好。

一个常见的图像分类网络如下所示(本例是多分类)。

model = models.Sequential()
model.add(layers.SeparableConv2D(32, 3, activation='relu',
 input_shape=(height, width, channels)))
model.add(layers.SeparableConv2D(64, 3, activation='relu'))
model.add(layers.MaxPooling2D(2))

model.add(layers.SeparableConv2D(64, 3, activation='relu'))
model.add(layers.SeparableConv2D(128, 3, activation='relu'))
model.add(layers.MaxPooling2D(2))

model.add(layers.SeparableConv2D(64, 3, activation='relu'))
model.add(layers.SeparableConv2D(128, 3, activation='relu'))
model.add(layers.GlobalAveragePooling2D())

model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(num_classes, activation='softmax'))

model.compile(optimizer='rmsprop', loss='categorical_crossentropy')

3. 循环神经网络

Keras 中有三种 RNN 层:SimpleRNN、GRU 和 LSTM。对于大多数实际用途,你应该使用GRU 或 LSTM。两者中 LSTM 更加强大,计算代价也更高。你可以将 GRU 看作是一种更简单、计算代价更小的替代方法。

想要将多个 RNN 层逐个堆叠在一起,最后一层之前的每一层都应该返回输出的完整序列(每个输入时间步都对应一个输出时间步)。如果你不再堆叠更多的 RNN 层,那么通常只返回最后一个输出,其中包含关于整个序列的信息。

下面是一个单层 RNN 层,用于向量序列的二分类。

model = models.Sequential()
model.add(layers.LSTM(32, input_shape=(num_timesteps, num_features)))
model.add(layers.Dense(num_classes, activation='sigmoid'))

model.compile(optimizer='rmsprop', loss='binary_crossentropy')

下面是 RNN 层的堆叠,用于向量序列的二分类。

model = models.Sequential()
model.add(layers.LSTM(32, return_sequences=True,
 input_shape=(num_timesteps, num_features)))
model.add(layers.LSTM(32, return_sequences=True))
model.add(layers.LSTM(32))
model.add(layers.Dense(num_classes, activation='sigmoid'))

model.compile(optimizer='rmsprop', loss='binary_crossentropy')

4.其它Keras资源

使用 Keras 的主要参考资料就是 Keras 的在线文档(https://keras.io)。Keras 的源代码位于 GitHub 上。

Keras 博客(https://blog.keras.io)提供了 Keras 教程以及其他与深度学习有关的文章。

你可能感兴趣的:(Python深度学习-Keras总结)