# 使用 TensorFlow 和 Keras
TensorFlow 非常適合為程序員提供的靈活性和強大功能。這樣做的一個缺點是原型模型和迭代各種測試對程序員來說可能很麻煩。 Keras 是深度學習庫的包裝器,可以更輕松地處理模型的各個方面并使編程更容易。在這里,我們選擇在 TensorFlow 之上使用 Keras。事實上,使用帶有 TensorFlow 后端的 Keras 非常受歡迎,TensorFlow 中有一個 Keras 庫。對于這個秘籍,我們將使用該 TensorFlow 庫在 MNIST 數據集上進行完全連接的神經網絡和簡單的 CNN 圖像網絡。
## 做好準備
對于這個秘籍,我們將使用駐留在 TensorFlow 內部的 Keras 函數。 Keras( [https://keras.io/](https://keras.io/) )已經是一個可以安裝的獨立 python 庫了。如果您選擇使用純 Keras 路線,則必須為 Keras 選擇后端(如 TensorFlow)。
在本文中,我們將在 MNIST 圖像識別數據集上執行兩個單獨的模型。第一個是直接完全連接的神經網絡,而第二個是從第 8 章第 2 節“實現簡單的 CNN”復制我們的 CNN 網絡。
## 操作步驟
1. 我們將首先為腳本加載必要的庫。
```py
import tensorflow as tf
from sklearn.preprocessing import MultiLabelBinarizer
from keras.utils import to_categorical
from tensorflow import keras
from tensorflow.python.framework import ops
ops.reset_default_graph()
# Load MNIST data
from tensorflow.examples.tutorials.mnist import input_data
```
1. 我們可以在 TensorFlow 中使用提供的 MNIST 數據導入函數加載庫。雖然原始 MNIST 圖像是 28 像素乘 28 像素,但導入的數據是它們的扁平版本,其中每個觀察是 0 到 1 之間的 784 個灰度點的行.y 標簽作為 0 到 9 之間的整數導入。
```py
mnist = input_data.read_data_sets("MNIST_data/")
x_train = mnist.train.images
x_test = mnist.test.images
y_train = mnist.train.labels
y_test = mnist.test.labels
y_train = [[i] for i in y_train]
y_test = [[i] for i in y_test]
```
1. 我們現在將使用 scikit-learn 的`MultiLabelBinarizer()`函數將目標整數轉換為單熱編碼向量,如下所示:
```py
one_hot = MultiLabelBinarizer()
y_train = one_hot.fit_transform(y_train)
y_test = one_hot.transform(y_test)
```
1. 我們將創建一個三層完全連接的神經網絡,其中包含 32,16 和 10 個相應的隱藏節點。然后最終輸出的大小為 10(每個數字一個)。我們使用以下代碼創建此網絡:
```py
# We start with a 'sequential' model type (connecting layers together)
model = keras.Sequential()
# Adds a densely-connected layer with 32 units to the model, followed by an ReLU activation.
model.add(keras.layers.Dense(32, activation='relu'))
# Adds a densely-connected layer with 16 units to the model, followed by an ReLU activation.
model.add(keras.layers.Dense(16, activation='relu'))
# Add a softmax layer with 10 output units:
model.add(keras.layers.Dense(10, activation='softmax'))
```
1. 為了訓練模型,我們接下來要做的就是使用適當的參數調用`compile()`方法。我們需要的參數是優化函數和損失類型。但我們也想記錄模型的準確率,因此度量列表包括`accuracy`參數。
```py
model.compile(optimizer=tf.train.AdamOptimizer(0.001),
loss='categorical_crossentropy',
metrics=['accuracy'])
```
1. 這將導致輸出應類似于以下內容:
```py
Epoch 1/5
64/55000 [..............................] - ETA: 1:44 - loss: 2.3504 - acc: 0.0625
3776/55000 [=>............................] - ETA: 2s - loss: 1.7904 - acc: 0.3676
...
47104/55000 [========================>.....] - ETA: 0s - loss: 0.1337 - acc: 0.9615
50880/55000 [==========================>...] - ETA: 0s - loss: 0.1336 - acc: 0.9617
55000/55000 [==============================] - 1s 13us/step - loss: 0.1335 - acc: 0.9615
Out[]: <tensorflow.python.keras.callbacks.History at 0x7f5768a40da0>
```
> 要配置均方誤差損失的回歸模型,我們將使用模型編譯,如下所示:`model.compile(optimizer=tf.train.AdamOptimizer(0.01), loss='mse', metrics=['mae'])`
1. 接下來,我們將看到如何實現具有兩個卷積層的 CNN 模型,其具有最大池,全部后面是完全連接的層。首先,我們必須將平面圖像重塑為 2D 圖像,并將 y 目標轉換為 numpy 數組,如下所示:00
```py
x_train = x_tra0in.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
input_shape = (28, 28, 1)
num_classes = 10
# Categorize y targets
y_test = to_categorical(mnist.test.labels)
y_train = to_categorical(mnist.train.labels)
```
1. 我們將像以前一樣以類似的順序層方法創建 CNN。這次我們將使用`Conv2D()`,`MaxPooling2D()`和`Dense()` Keras 函數創建我們的 CNN 模型,如下所示:
```py
cnn_model = keras.Sequential()
# First convolution layer
cnn_model.add(keras.layers.Conv2D(25,
kernel_size=(4, 4),
strides=(1, 1),
activation='relu',
input_shape=input_shape))
# Max pooling
cnn_model.add(keras.layers.MaxPooling2D(pool_size=(2, 2),
strides=(2, 2)))
# Second convolution layer
cnn_model.add(keras.layers.Conv2D(50,
kernel_size=(5, 5),
strides=(1, 1),
activation='relu'))
# Max pooling
cnn_model.add(keras.layers.MaxPooling2D(pool_size=(2, 2),
strides=(2, 2)))
# Flatten for dense (fully connected) layer
cnn_model.add(keras.layers.Flatten())
# Add dense (fully connected) layer
cnn_model.add(keras.layers.Dense(num_classes, activation='softmax'))
```
1. 接下來,我們將通過選擇優化和損失函數來編譯我們的模型。
```py
cnn_model.compile(optimizer=tf.train.AdamOptimizer(0.001),
loss='categorical_crossentropy',
metrics=['accuracy'])
```
1. Keras 還允許我們將函數插入到名為 Callbacks 的訓練代碼中。回調是在代碼中的某些時間執行的函數,可用于執行各種函數。有許多預制回調,可以保存模型,在特定標準下停止訓練,記錄值等等。有關各種選項的更多信息,請參閱 [https://keras.io/callbacks/](https://keras.io/callbacks/) 。為了說明如何制作我們自己的自定義回調并顯示它們如何工作,我們將創建一個名為`RecordAccuracy()`的回調,它是一個 Keras Callback 類,并將在每個周期的末尾存儲精度,如下所示:
```py
class RecordAccuracy(keras.callbacks.Callback):
def on_train_begin(self, logs={}):
self.acc = []
def on_epoch_end(self, batch, logs={}):
self.acc.append(logs.get('acc'))
accuracy = RecordAccuracy()
```
1. 接下來,我們將使用`fit()`方法訓練我們的 CNN 模型。這里我們將提供`validation_data`和`callbacks`如下:
```py
cnn_model.fit(x_train,
y_train,
batch_size=64,
epochs=3,
validation_data=(x_test, y_test),
callbacks=[accuracy])
print(accuracy.acc)
```
1. 此訓練將產生類似的輸出,如下所示:
```py
Train on 55000 samples, validate on 64 samples
Epoch 1/3
64/55000 [..............................] - ETA: 2:59 - loss: 2.2805 - acc: 0.0625
192/55000 [>.............................] - ETA: 1:14 - loss: 2.2729 - acc: 0.1302\
...
54848/55000 [============================>.] - ETA: 0s - loss: 0.0603 - acc: 0.9816
54976/55000 [============================>.] - ETA: 0s - loss: 0.0603 - acc: 0.9816
55000/55000 [==============================] - 26s 469us/step - loss: 0.0604 - acc: 0.9816 - val_loss: 0.0139 - val_acc: 1.0000
Out[]: <tensorflow.python.keras.callbacks.History at 0x7f69494c7780>
[0.9414363636450334, 0.9815818181731484, 0.9998980778226293]
```
## 工作原理
在這個秘籍中,我們展示了 Keras 的簡潔創建和訓練模型。您可以自動處理變量類型,維度和數據攝取的許多復雜細節。雖然這可以讓人放心,但我們應該意識到,如果我們掩蓋太多模型細節,我們可能無意中實現了錯誤的模型。
## 另見
有關 Keras 的更多信息,建議讀者查看以下資源:
* 官方 Keras 文件: [https://keras.io/](https://keras.io/)
* TensorFlow Keras 教程: [https://www.tensorflow.org/guide/keras](https://www.tensorflow.org/guide/keras)
* “Keras 簡介”,Francois Chollet 在斯坦福大學的客座講座(幻燈片中的 PDF 格式): [https://web.stanford.edu/class/cs20si/lectures/march9guestlecture.pdf](https://web.stanford.edu/class/cs20si/lectures/march9guestlecture.pdf)
- TensorFlow 入門
- 介紹
- TensorFlow 如何工作
- 聲明變量和張量
- 使用占位符和變量
- 使用矩陣
- 聲明操作符
- 實現激活函數
- 使用數據源
- 其他資源
- TensorFlow 的方式
- 介紹
- 計算圖中的操作
- 對嵌套操作分層
- 使用多個層
- 實現損失函數
- 實現反向傳播
- 使用批量和隨機訓練
- 把所有東西結合在一起
- 評估模型
- 線性回歸
- 介紹
- 使用矩陣逆方法
- 實現分解方法
- 學習 TensorFlow 線性回歸方法
- 理解線性回歸中的損失函數
- 實現 deming 回歸
- 實現套索和嶺回歸
- 實現彈性網絡回歸
- 實現邏輯回歸
- 支持向量機
- 介紹
- 使用線性 SVM
- 簡化為線性回歸
- 在 TensorFlow 中使用內核
- 實現非線性 SVM
- 實現多類 SVM
- 最近鄰方法
- 介紹
- 使用最近鄰
- 使用基于文本的距離
- 使用混合距離函數的計算
- 使用地址匹配的示例
- 使用最近鄰進行圖像識別
- 神經網絡
- 介紹
- 實現操作門
- 使用門和激活函數
- 實現單層神經網絡
- 實現不同的層
- 使用多層神經網絡
- 改進線性模型的預測
- 學習玩井字棋
- 自然語言處理
- 介紹
- 使用詞袋嵌入
- 實現 TF-IDF
- 使用 Skip-Gram 嵌入
- 使用 CBOW 嵌入
- 使用 word2vec 進行預測
- 使用 doc2vec 進行情緒分析
- 卷積神經網絡
- 介紹
- 實現簡單的 CNN
- 實現先進的 CNN
- 重新訓練現有的 CNN 模型
- 應用 StyleNet 和 NeuralStyle 項目
- 實現 DeepDream
- 循環神經網絡
- 介紹
- 為垃圾郵件預測實現 RNN
- 實現 LSTM 模型
- 堆疊多個 LSTM 層
- 創建序列到序列模型
- 訓練 Siamese RNN 相似性度量
- 將 TensorFlow 投入生產
- 介紹
- 實現單元測試
- 使用多個執行程序
- 并行化 TensorFlow
- 將 TensorFlow 投入生產
- 生產環境 TensorFlow 的一個例子
- 使用 TensorFlow 服務
- 更多 TensorFlow
- 介紹
- 可視化 TensorBoard 中的圖
- 使用遺傳算法
- 使用 k 均值聚類
- 求解常微分方程組
- 使用隨機森林
- 使用 TensorFlow 和 Keras