注:本系列全部博客将持续更新并发布在github上,您能够经过github下载本系列全部文章笔记文件。javascript
Keras是一个基于Python编写的高层神经网络API,凭借用户友好性、模块化以及易扩展等有点大受好评,考虑到Keras的优良特性以及它的受欢迎程度,TensorFlow2.0中将Keras的代码吸取了进来,化身为tf.keras模块供用户使用。css
使用tf.keras提供的高层API,能够轻松得完成建模三部曲——模型构建、训练、评估等工做。下面咱们分别来讲说如何使用tf.keras完成这三部曲。html
咱们知道,神经网络模型就是层的堆叠,tf.keras提供的Sequential类对象就是层容器,能够轻松实现对层的堆叠,建立网络模型。用Sequential建立一个全链接网络模型:html5
import tensorflow as tf from tensorflow import keras # 为方便使用,keras通常单独导入 from tensorflow.keras import layers
model = tf.keras.Sequential() # 往模型中添加一个有64个神经元组成的层,激活函数为relu: model.add(layers.Dense(64, activation='relu')) # 再添加一个: model.add(layers.Dense(64, activation='relu')) # 添加一个有10个神经元的softmax层做为输出层: model.add(layers.Dense(10, activation='softmax'))
也能够在使用Sequential实例化模型时,经过传入由层组成的列表来添加层。咱们换一种方式实现上面的模型构建过程,两种方式是彻底等效的:java
model = tf.keras.Sequential([ layers.Dense(64, activation='relu'), layers.Dense(64, activation='relu'), layers.Dense(10, activation='softmax')] )
你看,用tf.keras建立一个模型,就是这么简单,只须要往Sequential中传入一个个tf.keras.layers定义的层就行了。进一步的,咱们研究一下tf.keras.layers怎么个性化地建立层。node
定义神经网络层经过tf.keras.layers模块中的Dense类实现,Dense类构造参数以下:python
# 有64个神经元,激活函数为sigmoid的层 layers.Dense(64, activation='sigmoid') # 或者: layers.Dense(64, activation=tf.keras.activations.sigmoid) # 对权值矩阵进行正则化: layers.Dense(64, kernel_regularizer=tf.keras.regularizers.l1(0.01)) # 对偏置向量进行正则化: layers.Dense(64, bias_regularizer=tf.keras.regularizers.l2(0.01)) # 指定权值随机正交初始化: layers.Dense(64, kernel_initializer='orthogonal') # 指定偏置为常数: layers.Dense(64, bias_initializer=tf.keras.initializers.Constant(2.0))
<tensorflow.python.keras.layers.core.Dense at 0x7f486247abd0>
创建好模型以后,接下来固然是要进行训练模型了。不过,在训练前还须要作一些配置工做,例如指定优化器、损失函数、评估指标等,这些配置参数的过程通常经过tf.keras.Model.compile方法进行,先来熟悉一下tf.keras.Model.compile方法的三个经常使用参数:jquery
在知道怎么配置模型训练参数后,就能够根据实际应用状况合理选择优化器、损失函数、评估方法等:linux
# 回归模型 model.compile(optimizer=tf.keras.optimizers.Adam(0.01), # 指定优化器,学习率为0.01 loss='mse', # 指定均方差做为损失函数 metrics=['mae']) # 添加绝对值偏差做为评估方法 # 分类模型 model.compile(optimizer=tf.keras.optimizers.RMSprop(0.01), loss=tf.keras.losses.CategoricalCrossentropy(), # 分类模型多用交叉熵做为损失函数 metrics=[tf.keras.metrics.CategoricalAccuracy()])
经过compile()配置好模型后,就能够开始训练了。tf.keras中提供了fit()方法对模型进行训练,先来看看fit()方法的主要参数:android
下面分别说说如何使用fit()方法结合numpy数据和tf.data.Dataset数据进行模型训练。
import numpy as np data = np.random.random((1000, 32)) labels = np.random.random((1000, 10)) model.fit(data, labels, epochs=10, batch_size=32)
Train on 1000 samples Epoch 1/10 1000/1000 [==============================] - 1s 554us/sample - loss: 206.2688 - categorical_accuracy: 0.1050 Epoch 2/10 1000/1000 [==============================] - 0s 34us/sample - loss: 911.8347 - categorical_accuracy: 0.0990 Epoch 3/10 1000/1000 [==============================] - 0s 30us/sample - loss: 1879.7505 - categorical_accuracy: 0.0980 Epoch 4/10 1000/1000 [==============================] - 0s 28us/sample - loss: 3141.3959 - categorical_accuracy: 0.0940 Epoch 5/10 1000/1000 [==============================] - 0s 36us/sample - loss: 4673.7791 - categorical_accuracy: 0.1010 Epoch 6/10 1000/1000 [==============================] - 0s 36us/sample - loss: 6526.8757 - categorical_accuracy: 0.0960 Epoch 7/10 1000/1000 [==============================] - 0s 31us/sample - loss: 8571.8533 - categorical_accuracy: 0.1020 Epoch 8/10 1000/1000 [==============================] - 0s 33us/sample - loss: 11070.1039 - categorical_accuracy: 0.0970 Epoch 9/10 1000/1000 [==============================] - 0s 36us/sample - loss: 13533.4661 - categorical_accuracy: 0.1050 Epoch 10/10 1000/1000 [==============================] - 0s 25us/sample - loss: 17259.2291 - categorical_accuracy: 0.1000
<tensorflow.python.keras.callbacks.History at 0x7f74a4755650>
如何使用验证数据集的话,能够这样:
import numpy as np data = np.random.random((1000, 32)) labels = np.random.random((1000, 10)) val_data = np.random.random((100, 32)) val_labels = np.random.random((100, 10)) model.fit(data, labels, epochs=10, batch_size=32, validation_data=(val_data, val_labels)) # 验证数据集以元组的形式传入
Train on 1000 samples, validate on 100 samples Epoch 1/10 1000/1000 [==============================] - 0s 34us/sample - loss: 67219.8359 - categorical_accuracy: 0.0960 - val_loss: 55306.6777 - val_categorical_accuracy: 0.1000 Epoch 2/10 1000/1000 [==============================] - 0s 32us/sample - loss: 73732.5724 - categorical_accuracy: 0.0920 - val_loss: 89920.2088 - val_categorical_accuracy: 0.1100 Epoch 3/10 1000/1000 [==============================] - 0s 50us/sample - loss: 79956.1480 - categorical_accuracy: 0.1020 - val_loss: 101092.6750 - val_categorical_accuracy: 0.1000 Epoch 4/10 1000/1000 [==============================] - 0s 36us/sample - loss: 84322.9844 - categorical_accuracy: 0.0970 - val_loss: 117610.5700 - val_categorical_accuracy: 0.1000 Epoch 5/10 1000/1000 [==============================] - 0s 38us/sample - loss: 91992.0751 - categorical_accuracy: 0.1130 - val_loss: 94200.0838 - val_categorical_accuracy: 0.1000 Epoch 6/10 1000/1000 [==============================] - 0s 38us/sample - loss: 97189.2044 - categorical_accuracy: 0.0910 - val_loss: 89020.5294 - val_categorical_accuracy: 0.1100 Epoch 7/10 1000/1000 [==============================] - 0s 33us/sample - loss: 107109.9905 - categorical_accuracy: 0.0930 - val_loss: 102350.4259 - val_categorical_accuracy: 0.1200 Epoch 8/10 1000/1000 [==============================] - 0s 41us/sample - loss: 114450.2496 - categorical_accuracy: 0.1010 - val_loss: 102719.3653 - val_categorical_accuracy: 0.1100 Epoch 9/10 1000/1000 [==============================] - 0s 41us/sample - loss: 124694.8415 - categorical_accuracy: 0.0950 - val_loss: 142269.8362 - val_categorical_accuracy: 0.1100 Epoch 10/10 1000/1000 [==============================] - 0s 44us/sample - loss: 131952.7791 - categorical_accuracy: 0.0800 - val_loss: 158925.8294 - val_categorical_accuracy: 0.0900
<tensorflow.python.keras.callbacks.History at 0x7f749c548810>
是骡子是马,拉出来溜溜就知道了,训练好的模型性能如何,评估测试一下就知道了。可使用模型自带的evaluate()方法和predict()方法对模型进行评估和预测。
# 若是是numpy数据,能够这么使用 data = np.random.random((1000, 32)) labels = np.random.random((1000, 10)) model.evaluate(data, labels, batch_size=32)
1000/1 [=================================================] - 0s 17us/sample - loss: 161163.7180 - categorical_accuracy: 0.0930
[153591.27975, 0.093]
# 若是数Dataset对象,能够这么使用 dataset = tf.data.Dataset.from_tensor_slices((data, labels)) dataset = dataset.batch(32) model.evaluate(dataset)
32/32 [==============================] - 0s 579us/step - loss: 153946.2378 - categorical_accuracy: 0.0930
[153946.23779296875, 0.093]
使用predict()方法进行预测:
# numpy数据 result = model.predict(data, batch_size=32) print(result.shape)
(1000, 10)
# dataset数据 result = model.predict(dataset) print(result.shape)