TensorFlow高阶 API: keras教程-使用tf.keras搭建mnist手写数字识别网络
TensorFlow高階 API:keras教程-使用tf.keras搭建mnist手寫數字識別網絡
目錄
TensorFlow高階 API:keras教程-使用tf.keras搭建mnist手寫數字識別網絡
1、Keras
2、導入 tf.keras
3、構建簡單的模型
3.1、序列模型
3.2、配置層
4、訓練和評估
4.1、設置訓練流程
4.2、輸入 NumPy 數據
4.3、輸入 tf.data 數據集
4.4、評估和預測
5、構建高級模型
5.1、函數式 API
5.2、模型子類化
5.3、自定義層
6、回調
7、保存和恢復
7.1、僅限權重
7.2、僅限配置
8、整個模型
9、Eager Execution
10、分布
10.1、Estimator
10.2、多個 GPU
11、例子1:使用tf.keras搭建mnist手寫數字識別網絡
11.1、Mnist數據集準備
11.2、建立模型
11.3、卷積神經網絡
12、例子2:cifar10分類
1、Keras
Keras 是一個用于構建和訓練深度學習模型的高階 API。它可用于快速設計原型、高級研究和生產,具有以下三個主要優勢:
- 方便用戶使用
Keras 具有針對常見用例做出優化的簡單而一致的界面。它可針對用戶錯誤提供切實可行的清晰反饋。 - 模塊化和可組合
將可配置的構造塊連接在一起就可以構建 Keras 模型,并且幾乎不受限制。 - 易于擴展
可以編寫自定義構造塊以表達新的研究創意,并且可以創建新層、損失函數并開發先進的模型。 
官方教程:https://www.tensorflow.org/guide/keras
Keras中文教程:https://keras-cn.readthedocs.io/en/latest/?(五分推薦)
2、導入 tf.keras
tf.keras?是 TensorFlow 對?Keras API 規范的實現。這是一個用于構建和訓練模型的高階 API,包含對 TensorFlow 特定功能(例如?Eager Execution、tf.data?管道和?Estimator)的頂級支持。?tf.keras?使 TensorFlow 更易于使用,并且不會犧牲靈活性和性能。
首先,導入?tf.keras?以設置 TensorFlow 程序:
import tensorflow as tf from tensorflow import kerastf.keras?可以運行任何與 Keras 兼容的代碼,但請注意:
- 最新版 TensorFlow 中的?tf.keras?版本可能與 PyPI 中的最新?keras?版本不同。請查看?tf.keras.version。
 - 保存模型的權重時,tf.keras?默認采用檢查點格式。請傳遞?save_format='h5'?以使用 HDF5。
 
3、構建簡單的模型
3.1、序列模型
在 Keras 中,您可以通過組合層來構建模型。模型(通常)是由層構成的圖。最常見的模型類型是層的堆疊:tf.keras.Sequential?模型。
要構建一個簡單的全連接網絡(即多層感知器),請運行以下代碼:
model = keras.Sequential() # Adds a densely-connected layer with 64 units to the model: model.add(keras.layers.Dense(64, activation='relu')) # Add another: model.add(keras.layers.Dense(64, activation='relu')) # Add a softmax layer with 10 output units: model.add(keras.layers.Dense(10, activation='softmax'))圖文例子:?
3.2、配置層
我們可以使用很多?tf.keras.layers,它們具有一些相同的構造函數參數:
- activation:設置層的激活函數。此參數由內置函數的名稱指定,或指定為可調用對象。默認情況下,系統不會應用任何激活函數。
 - kernel_initializer?和?bias_initializer:創建層權重(核和偏差)的初始化方案。此參數是一個名稱或可調用對象,默認為?"Glorot uniform"?初始化器。
 - kernel_regularizer?和?bias_regularizer:應用層權重(核和偏差)的正則化方案,例如 L1 或 L2 正則化。默認情況下,系統不會應用正則化函數。
 
以下代碼使用構造函數參數實例化?tf.keras.layers.Dense?層:
# Create a sigmoid layer: layers.Dense(64, activation='sigmoid') # Or: layers.Dense(64, activation=tf.sigmoid)# A linear layer with L1 regularization of factor 0.01 applied to the kernel matrix: layers.Dense(64, kernel_regularizer=keras.regularizers.l1(0.01)) # A linear layer with L2 regularization of factor 0.01 applied to the bias vector: layers.Dense(64, bias_regularizer=keras.regularizers.l2(0.01))# A linear layer with a kernel initialized to a random orthogonal matrix: layers.Dense(64, kernel_initializer='orthogonal') # A linear layer with a bias vector initialized to 2.0s: layers.Dense(64, bias_initializer=keras.initializers.constant(2.0))4、訓練和評估
4.1、設置訓練流程
構建好模型后,通過調用?compile?方法配置該模型的學習流程:
model.compile(optimizer=tf.train.AdamOptimizer(0.001),loss='categorical_crossentropy',metrics=['accuracy'])tf.keras.Model.compile?采用三個重要參數:
- optimizer:此對象會指定訓練過程。從?tf.train?模塊向其傳遞優化器實例,例如?AdamOptimizer、RMSPropOptimizer?或?GradientDescentOptimizer。
 - loss:要在優化期間最小化的函數。常見選擇包括均方誤差 (mse)、categorical_crossentropy?和?binary_crossentropy。損失函數由名稱或通過從?tf.keras.losses?模塊傳遞可調用對象來指定。
 - metrics:用于監控訓練。它們是?tf.keras.metrics?模塊中的字符串名稱或可調用對象。
 
以下代碼展示了配置模型以進行訓練的幾個示例:
# Configure a model for mean-squared error regression. model.compile(optimizer=tf.train.AdamOptimizer(0.01),loss='mse', ? ? ? # mean squared errormetrics=['mae']) ?# mean absolute error# Configure a model for categorical classification. model.compile(optimizer=tf.train.RMSPropOptimizer(0.01),loss=keras.losses.categorical_crossentropy,metrics=[keras.metrics.categorical_accuracy])4.2、輸入 NumPy 數據
對于小型數據集,請使用內存中的?NumPy?數組訓練和評估模型。使用?fit?方法使模型與訓練數據“擬合”:
import numpy as npdata = np.random.random((1000, 32)) labels = np.random.random((1000, 10))model.fit(data, labels, epochs=10, batch_size=32)tf.keras.Model.fit?采用三個重要參數:
- epochs:以周期為單位進行訓練。一個周期是對整個輸入數據的一次迭代(以較小的批次完成迭代)。
 - batch_size:當傳遞 NumPy 數據時,模型將數據分成較小的批次,并在訓練期間迭代這些批次。此整數指定每個批次的大小。請注意,如果樣本總數不能被批次大小整除,則最后一個批次可能更小。
 - validation_data:在對模型進行原型設計時,您需要輕松監控該模型在某些驗證數據上達到的效果。傳遞此參數(輸入和標簽元組)可以讓該模型在每個周期結束時以推理模式顯示所傳遞數據的損失和指標。
 
下面是使用?validation_data?的示例:
import numpy as npdata = 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))4.3、輸入 tf.data 數據集
使用?Datasets API?可擴展為大型數據集或多設備訓練。將?tf.data.Dataset?實例傳遞到?fit?方法:
# Instantiates a toy dataset instance: dataset = tf.data.Dataset.from_tensor_slices((data, labels)) dataset = dataset.batch(32) dataset = dataset.repeat()# Don't forget to specify `steps_per_epoch` when calling `fit` on a dataset. model.fit(dataset, epochs=10, steps_per_epoch=30)在上方代碼中,fit?方法使用了?steps_per_epoch?參數(該參數表示模型在進入下一個周期之前運行的訓練步數)。由于?Dataset?會生成批次數據,因此該代碼段不需要?batch_size。
數據集也可用于驗證:
dataset = tf.data.Dataset.from_tensor_slices((data, labels)) dataset = dataset.batch(32).repeat()val_dataset = tf.data.Dataset.from_tensor_slices((val_data, val_labels)) val_dataset = val_dataset.batch(32).repeat()model.fit(dataset, epochs=10, steps_per_epoch=30,validation_data=val_dataset,validation_steps=3)4.4、評估和預測
tf.keras.Model.evaluate?和?tf.keras.Model.predict?方法可以使用 NumPy 數據和?tf.data.Dataset。
要評估所提供數據的推理模式損失和指標,請運行以下代碼:
model.evaluate(x, y, batch_size=32)model.evaluate(dataset, steps=30)要在所提供數據(采用 NumPy 數組形式)的推理中預測最后一層的輸出,請運行以下代碼:
model.predict(x, batch_size=32)model.predict(dataset, steps=30)5、構建高級模型
5.1、函數式 API
tf.keras.Sequential?模型是層的簡單堆疊,無法表示任意模型。使用?Keras 函數式 API?可以構建復雜的模型拓撲,例如:
- 多輸入模型,
 - 多輸出模型,
 - 具有共享層的模型(同一層被調用多次),
 - 具有非序列數據流的模型(例如,剩余連接)。
 
使用函數式 API 構建的模型具有以下特征:
以下示例使用函數式 API 構建一個簡單的全連接網絡:
inputs = keras.Input(shape=(32,)) ?# Returns a placeholder tensor# A layer instance is callable on a tensor, and returns a tensor. x = keras.layers.Dense(64, activation='relu')(inputs) x = keras.layers.Dense(64, activation='relu')(x) predictions = keras.layers.Dense(10, activation='softmax')(x)# Instantiate the model given inputs and outputs. model = keras.Model(inputs=inputs, outputs=predictions)# The compile step specifies the training configuration. model.compile(optimizer=tf.train.RMSPropOptimizer(0.001),loss='categorical_crossentropy',metrics=['accuracy'])# Trains for 5 epochs model.fit(data, labels, batch_size=32, epochs=5)5.2、模型子類化
通過對?tf.keras.Model?進行子類化并定義您自己的前向傳播來構建完全可自定義的模型。在?__init__?方法中創建層并將它們設置為類實例的屬性。在?call?方法中定義前向傳播。
在啟用?Eager Execution?時,模型子類化特別有用,因為可以命令式地編寫前向傳播。
要點:針對作業使用正確的 API。雖然模型子類化較為靈活,但代價是復雜性更高且用戶出錯率更高。如果可能,請首選函數式 API。
以下示例展示了使用自定義前向傳播進行子類化的?tf.keras.Model:
class MyModel(keras.Model):def __init__(self, num_classes=10):super(MyModel, self).__init__(name='my_model')self.num_classes = num_classes# Define your layers here.self.dense_1 = keras.layers.Dense(32, activation='relu')self.dense_2 = keras.layers.Dense(num_classes, activation='sigmoid')def call(self, inputs):# Define your forward pass here,# using layers you previously defined (in `__init__`).x = self.dense_1(inputs)return self.dense_2(x)def compute_output_shape(self, input_shape):# You need to override this function if you want to use the subclassed model# as part of a functional-style model.# Otherwise, this method is optional.shape = tf.TensorShape(input_shape).as_list()shape[-1] = self.num_classesreturn tf.TensorShape(shape)# Instantiates the subclassed model. model = MyModel(num_classes=10)# The compile step specifies the training configuration. model.compile(optimizer=tf.train.RMSPropOptimizer(0.001),loss='categorical_crossentropy',metrics=['accuracy'])# Trains for 5 epochs. model.fit(data, labels, batch_size=32, epochs=5)5.3、自定義層
通過對?tf.keras.layers.Layer?進行子類化并實現以下方法來創建自定義層:
- build:創建層的權重。使用?add_weight?方法添加權重。
 - call:定義前向傳播。
 - compute_output_shape:指定在給定輸入形狀的情況下如何計算層的輸出形狀。
 - 或者,可以通過實現?get_config?方法和?from_config?類方法序列化層。
 
下面是一個使用核矩陣實現輸入?matmul?的自定義層示例:
class MyLayer(keras.layers.Layer):def __init__(self, output_dim, **kwargs):self.output_dim = output_dimsuper(MyLayer, self).__init__(**kwargs)def build(self, input_shape):shape = tf.TensorShape((input_shape[1], self.output_dim))# Create a trainable weight variable for this layer.self.kernel = self.add_weight(name='kernel',shape=shape,initializer='uniform',trainable=True)# Be sure to call this at the endsuper(MyLayer, self).build(input_shape)def call(self, inputs):return tf.matmul(inputs, self.kernel)def compute_output_shape(self, input_shape):shape = tf.TensorShape(input_shape).as_list()shape[-1] = self.output_dimreturn tf.TensorShape(shape)def get_config(self):base_config = super(MyLayer, self).get_config()base_config['output_dim'] = self.output_dim@classmethoddef from_config(cls, config):return cls(**config)# Create a model using the custom layer model = keras.Sequential([MyLayer(10),keras.layers.Activation('softmax')])# The compile step specifies the training configuration model.compile(optimizer=tf.train.RMSPropOptimizer(0.001),loss='categorical_crossentropy',metrics=['accuracy'])# Trains for 5 epochs. model.fit(data, targets, batch_size=32, epochs=5)6、回調
回調是傳遞給模型的對象,用于在訓練期間自定義該模型并擴展其行為。您可以編寫自定義回調,也可以使用包含以下方法的內置?tf.keras.callbacks:
- tf.keras.callbacks.ModelCheckpoint:定期保存模型的檢查點。
 - tf.keras.callbacks.LearningRateScheduler:動態更改學習速率。
 - tf.keras.callbacks.EarlyStopping:在驗證效果不再改進時中斷訓練。
 - tf.keras.callbacks.TensorBoard:使用?TensorBoard?監控模型的行為。
 
要使用?tf.keras.callbacks.Callback,請將其傳遞給模型的?fit?方法:
callbacks = [# Interrupt training if `val_loss` stops improving for over 2 epochskeras.callbacks.EarlyStopping(patience=2, monitor='val_loss'),# Write TensorBoard logs to `./logs` directorykeras.callbacks.TensorBoard(log_dir='./logs') ] model.fit(data, labels, batch_size=32, epochs=5, callbacks=callbacks,validation_data=(val_data, val_targets))7、保存和恢復
7.1、僅限權重
使用?tf.keras.Model.save_weights?保存并加載模型的權重:
# Save weights to a TensorFlow Checkpoint file model.save_weights('./my_model')# Restore the model's state, # this requires a model with the same architecture. model.load_weights('my_model')默認情況下,會以?TensorFlow 檢查點文件格式保存模型的權重。權重也可以另存為 Keras HDF5 格式(Keras 多后端實現的默認格式):
# Save weights to a HDF5 file model.save_weights('my_model.h5', save_format='h5')# Restore the model's state model.load_weights('my_model.h5')7.2、僅限配置
可以保存模型的配置,此操作會對模型架構(不含任何權重)進行序列化。即使沒有定義原始模型的代碼,保存的配置也可以重新創建并初始化相同的模型。Keras 支持 JSON 和 YAML 序列化格式:
# Serialize a model to JSON format json_string = model.to_json()# Recreate the model (freshly initialized) fresh_model = keras.models.from_json(json_string)# Serializes a model to YAML format yaml_string = model.to_yaml()# Recreate the model fresh_model = keras.models.from_yaml(yaml_string)注意:子類化模型不可序列化,因為它們的架構由?call?方法正文中的 Python 代碼定義。
8、整個模型
整個模型可以保存到一個文件中,其中包含權重值、模型配置乃至優化器配置。這樣,您就可以對模型設置檢查點并稍后從完全相同的狀態繼續訓練,而無需訪問原始代碼。
# Create a trivial model model = keras.Sequential([keras.layers.Dense(10, activation='softmax', input_shape=(32,)),keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy']) model.fit(data, targets, batch_size=32, epochs=5)# Save entire model to a HDF5 file model.save('my_model.h5')# Recreate the exact same model, including weights and optimizer. model = keras.models.load_model('my_model.h5')9、Eager Execution
Eager Execution?是一種命令式編程環境,可立即評估操作。此環境對于 Keras 并不是必需的,但是受?tf.keras?的支持,并且可用于檢查程序和調試。
所有?tf.keras?模型構建 API 都與 Eager Execution 兼容。雖然可以使用?Sequential?和函數式 API,但 Eager Execution 對模型子類化和構建自定義層特別有用。與通過組合現有層來創建模型的 API 不同,函數式 API 要求您編寫前向傳播代碼。
請參閱?Eager Execution 指南,了解將 Keras 模型與自定義訓練循環和?tf.GradientTape?搭配使用的示例。
10、分布
10.1、Estimator
Estimator?API 用于針對分布式環境訓練模型。它適用于一些行業使用場景,例如用大型數據集進行分布式訓練并導出模型以用于生產。
tf.keras.Model?可以通過?tf.estimator?API 進行訓練,方法是將該模型轉換為?tf.estimator.Estimator?對象(通過?tf.keras.estimator.model_to_estimator)。請參閱用 Keras 模型創建 Estimator。
model = keras.Sequential([layers.Dense(10,activation='softmax'),layers.Dense(10,activation='softmax')])model.compile(optimizer=tf.train.RMSPropOptimizer(0.001),loss='categorical_crossentropy',metrics=['accuracy'])estimator = keras.estimator.model_to_estimator(model)注意:請啟用?Eager Execution?以調試?Estimator 輸入函數并檢查數據。
10.2、多個 GPU
tf.keras?模型可以使用?tf.contrib.distribute.DistributionStrategy?在多個 GPU 上運行。此 API 在多個 GPU 上提供分布式訓練,幾乎不需要更改現有代碼。
目前,tf.contrib.distribute.MirroredStrategy?是唯一受支持的分布策略。MirroredStrategy?通過在一臺機器上使用規約在同步訓練中進行圖內復制。要將?DistributionStrategy?與 Keras 搭配使用,請將?tf.keras.Model?轉換為?tf.estimator.Estimator(通過?tf.keras.estimator.model_to_estimator),然后訓練 Estimator
以下示例在一臺機器上的多個 GPU 間分布了?tf.keras.Model。
首先,定義一個簡單的模型:
model = keras.Sequential() model.add(keras.layers.Dense(16, activation='relu', input_shape=(10,))) model.add(keras.layers.Dense(1, activation='sigmoid'))optimizer = tf.train.GradientDescentOptimizer(0.2)model.compile(loss='binary_crossentropy', optimizer=optimizer) model.summary()定義輸入管道。input_fn?會返回?tf.data.Dataset?對象,此對象用于將數據分布在多臺設備上,每臺設備處理輸入批次數據的一部分。
def input_fn():x = np.random.random((1024, 10))y = np.random.randint(2, size=(1024, 1))x = tf.cast(x, tf.float32)dataset = tf.data.Dataset.from_tensor_slices((x, y))dataset = dataset.repeat(10)dataset = dataset.batch(32)return dataset接下來,創建?tf.estimator.RunConfig?并將?train_distribute?參數設置為?tf.contrib.distribute.MirroredStrategy?實例。創建?MirroredStrategy?時,您可以指定設備列表或設置?num_gpus?參數。默認使用所有可用的 GPU,如下所示:
strategy = tf.contrib.distribute.MirroredStrategy() config = tf.estimator.RunConfig(train_distribute=strategy)將 Keras 模型轉換為?tf.estimator.Estimator?實例:
keras_estimator = keras.estimator.model_to_estimator(keras_model=model,config=config,model_dir='/tmp/model_dir')最后,通過提供?input_fn?和?steps?參數訓練?Estimator?實例:
keras_estimator.train(input_fn=input_fn, steps=10)11、例子1:使用tf.keras搭建mnist手寫數字識別網絡
導入相關的Python包:
import tensorflow as tf from tensorflow import keras import matplotlib.pyplot as plt import numpy as np mnist=keras.datasets.mnist11.1、Mnist數據集準備
我們以mnist數據集為例,構建一個神經網絡實現手寫數字的訓練與測試,首先我們需要認識一下mnist數據集,mnist數據集有6萬張手寫圖像,1萬張測試圖像。Keras通過datase來下載與使用mnist數據集,下載與讀取的代碼如下:
def get_train_val(mnist_path):# mnist下載地址:https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz(train_images, train_labels), (test_images, test_labels) = mnist.load_data(mnist_path)print("train_images nums:{}".format(len(train_images)))print("test_images nums:{}".format(len(test_images)))return train_images, train_labels, test_images, test_labels通可以調用下面的函數顯示手寫數字圖像:
def show_mnist(images,labels):for i in range(25):plt.subplot(5,5,i+1)plt.xticks([])plt.yticks([ ])plt.grid(False)plt.imshow(images[i],cmap=plt.cm.gray)plt.xlabel(str(labels[i]))plt.show()對數據re-scale到0~1.0之間,對標簽進行了one-hot編碼,代碼如下:
#?re-scale?to?0~1.0之間train_images=train_images/255.0test_images=test_images/255.0train_labels=one_hot(train_labels)test_labels=one_hot(test_labels)其中one-hot編碼函數如下:
def one_hot(labels):onehot_labels=np.zeros(shape=[len(labels),10])for i in range(len(labels)):index=labels[i]onehot_labels[i][index]=1return onehot_labels11.2、建立模型
構建神經網絡
- 輸入層為28x28=784個輸入節點
 - 隱藏層120個節點
 - 輸出層10個節點
 
首先需要定義模型:
model = keras.Sequential()然后按順序添加模型各層
model.add(keras.layers.Flatten(input_shape=(28, 28)))model.add(keras.layers.Dense(units=120, activation=tf.nn.relu))model.add(keras.layers.Dense(units=10, activation=tf.nn.softmax))封裝成一個函數:
def mnist_net():model = keras.Sequential()model.add(keras.layers.Flatten(input_shape=(28, 28)))model.add(keras.layers.Dense(units=120, activation=tf.nn.relu))model.add(keras.layers.Dense(units=10, activation=tf.nn.softmax))return model編譯模型
 模型還需要再進行幾項設置才可以開始訓練。這些設置會添加到模型的編譯步驟:
損失函數
 衡量模型在訓練期間的準確率。我們希望盡可能縮小該函數,以“引導”模型朝著正確的方向優化。
優化器
 根據模型看到的數據及其損失函數更新模型的方式。
指標
 用于監控訓練和測試步驟。以下示例使用準確率,即圖像被正確分類的比例
訓練模型
 訓練神經網絡模型需要執行以下步驟:
 將訓練數據饋送到模型中,在本示例中為 train_images 和 train_labels 數組。
 模型學習將圖像與標簽相關聯。我們要求模型對測試集進行預測,在本示例中為 test_images 數組。我們會驗證預測結果是否與 test_labels 數組中的標簽一致。
 要開始訓練,請調用 model.fit 方法,使模型與訓練數據“擬合”:
評估模型
 模型在測試集數據上運行:
使用模型進行預測
#?開始預測cnt=0predictions=model.predict(test_images)for i in range(len(test_images)):target=np.argmax(predictions[i])label=np.argmax(test_labels[i])if target==label:cnt +=1print("correct?prediction?of?total?:?%.2f"%(cnt/len(test_images)))保存模型
model.save('mnist-model.h5')完整的訓練代碼:
# -*-coding: utf-8 -*- """@Project: tensorflow-yolov3@File : keras_mnist.py@Author : panjq@E-mail : pan_jinquan@163.com@Date : 2019-01-31 09:30:12 """ import tensorflow as tf from tensorflow import keras import matplotlib.pyplot as plt import numpy as np mnist=keras.datasets.mnistdef get_train_val(mnist_path):# mnist下載地址:https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz(train_images, train_labels), (test_images, test_labels) = mnist.load_data(mnist_path)print("train_images nums:{}".format(len(train_images)))print("test_images nums:{}".format(len(test_images)))return train_images, train_labels, test_images, test_labelsdef show_mnist(images,labels):for i in range(25):plt.subplot(5,5,i+1)plt.xticks([])plt.yticks([ ])plt.grid(False)plt.imshow(images[i],cmap=plt.cm.gray)plt.xlabel(str(labels[i]))plt.show()def one_hot(labels):onehot_labels=np.zeros(shape=[len(labels),10])for i in range(len(labels)):index=labels[i]onehot_labels[i][index]=1return onehot_labelsdef mnist_net():model = keras.Sequential()model.add(keras.layers.Flatten(input_shape=(28, 28)))model.add(keras.layers.Dense(units=120, activation=tf.nn.relu))model.add(keras.layers.Dense(units=10, activation=tf.nn.softmax))return modeldef trian_model(train_images,train_labels,test_images,test_labels):#?re-scale?to?0~1.0之間train_images=train_images/255.0test_images=test_images/255.0train_labels=one_hot(train_labels)test_labels=one_hot(test_labels)# 建立模型model = mnist_net()model.compile(optimizer=tf.train.AdamOptimizer(),loss="categorical_crossentropy",metrics=['accuracy'])model.fit(x=train_images,y=train_labels,epochs=5)test_loss,test_acc=model.evaluate(x=test_images,y=test_labels)print("Test?Accuracy?%.2f"%test_acc)#?開始預測cnt=0predictions=model.predict(test_images)for i in range(len(test_images)):target=np.argmax(predictions[i])label=np.argmax(test_labels[i])if target==label:cnt +=1print("correct?prediction?of?total?:?%.2f"%(cnt/len(test_images)))model.save('mnist-model.h5')if __name__=="__main__":mnist_path = 'D:/MyGit/tensorflow-yolov3/data/mnist.npz'train_images, train_labels, test_images, test_labels=get_train_val(mnist_path)show_mnist(train_images, train_labels)trian_model(train_images, train_labels, test_images, test_labels)11.3、構建卷積神經網絡
mnist數據轉換為四維
# mnist數據轉換為四維train_images=np.expand_dims(train_images,axis = 3)test_images=np.expand_dims(test_images,axis = 3)print("train_images :{}".format(train_images.shape))print("test_images :{}".format(test_images.shape))創建模型并構建CNN各層
def mnist_cnn(input_shape):'''構建一個CNN網絡模型:param input_shape: 指定輸入維度,當然也可以指定:return:'''model=keras.Sequential()model.add(keras.layers.Conv2D(filters=32,kernel_size = 5,strides = (1,1),padding = 'same',activation = tf.nn.relu,input_shape = input_shape))model.add(keras.layers.MaxPool2D(pool_size=(2,2), strides = (2,2), padding = 'valid'))model.add(keras.layers.Conv2D(filters=64,kernel_size = 3,strides = (1,1),padding = 'same',activation = tf.nn.relu))model.add(keras.layers.MaxPool2D(pool_size=(2,2), strides = (2,2), padding = 'valid'))model.add(keras.layers.Dropout(0.25))model.add(keras.layers.Flatten())model.add(keras.layers.Dense(units=128,activation = tf.nn.relu))model.add(keras.layers.Dropout(0.5))model.add(keras.layers.Dense(units=10,activation = tf.nn.softmax))return model完成的代碼:
# -*-coding: utf-8 -*- """@Project: tensorflow-yolov3@File : keras_mnist.py@Author : panjq@E-mail : pan_jinquan@163.com@Date : 2019-01-31 09:30:12 """ import tensorflow as tf from tensorflow import keras import matplotlib.pyplot as plt import numpy as np mnist=keras.datasets.mnistdef get_train_val(mnist_path):# mnist下載地址:https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz(train_images, train_labels), (test_images, test_labels) = mnist.load_data(mnist_path)print("train_images nums:{}".format(len(train_images)))print("test_images nums:{}".format(len(test_images)))return train_images, train_labels, test_images, test_labelsdef show_mnist(images,labels):for i in range(25):plt.subplot(5,5,i+1)plt.xticks([])plt.yticks([ ])plt.grid(False)plt.imshow(images[i],cmap=plt.cm.gray)plt.xlabel(str(labels[i]))plt.show()def one_hot(labels):onehot_labels=np.zeros(shape=[len(labels),10])for i in range(len(labels)):index=labels[i]onehot_labels[i][index]=1return onehot_labelsdef mnist_net(input_shape):'''構建一個簡單的全連接層網絡模型:輸入層為28x28=784個輸入節點隱藏層120個節點輸出層10個節點:param input_shape: 指定輸入維度,當然也可以指定:return:'''model = keras.Sequential()model.add(keras.layers.Flatten(input_shape=input_shape)) #輸出層model.add(keras.layers.Dense(units=120, activation=tf.nn.relu)) #隱含層model.add(keras.layers.Dense(units=10, activation=tf.nn.softmax))#輸出層return modeldef mnist_cnn(input_shape):'''構建一個CNN網絡模型:param input_shape: 指定輸入維度,當然也可以指定:return:'''model=keras.Sequential()model.add(keras.layers.Conv2D(filters=32,kernel_size = 5,strides = (1,1),padding = 'same',activation = tf.nn.relu,input_shape = input_shape))model.add(keras.layers.MaxPool2D(pool_size=(2,2), strides = (2,2), padding = 'valid'))model.add(keras.layers.Conv2D(filters=64,kernel_size = 3,strides = (1,1),padding = 'same',activation = tf.nn.relu))model.add(keras.layers.MaxPool2D(pool_size=(2,2), strides = (2,2), padding = 'valid'))model.add(keras.layers.Dropout(0.25))model.add(keras.layers.Flatten())model.add(keras.layers.Dense(units=128,activation = tf.nn.relu))model.add(keras.layers.Dropout(0.5))model.add(keras.layers.Dense(units=10,activation = tf.nn.softmax))return modeldef trian_model(train_images,train_labels,test_images,test_labels):#?re-scale?to?0~1.0之間train_images=train_images/255.0test_images=test_images/255.0# mnist數據轉換為四維train_images=np.expand_dims(train_images,axis = 3)test_images=np.expand_dims(test_images,axis = 3)print("train_images :{}".format(train_images.shape))print("test_images :{}".format(test_images.shape))train_labels=one_hot(train_labels)test_labels=one_hot(test_labels)# 建立模型# model = mnist_net(input_shape=(28,28))model=mnist_cnn(input_shape=(28,28,1))model.compile(optimizer=tf.train.AdamOptimizer(),loss="categorical_crossentropy",metrics=['accuracy'])model.fit(x=train_images,y=train_labels,epochs=5)test_loss,test_acc=model.evaluate(x=test_images,y=test_labels)print("Test?Accuracy?%.2f"%test_acc)#?開始預測cnt=0predictions=model.predict(test_images)for i in range(len(test_images)):target=np.argmax(predictions[i])label=np.argmax(test_labels[i])if target==label:cnt +=1print("correct?prediction?of?total?:?%.2f"%(cnt/len(test_images)))model.save('mnist-model.h5')if __name__=="__main__":mnist_path = 'D:/MyGit/tensorflow-yolov3/data/mnist.npz'train_images, train_labels, test_images, test_labels=get_train_val(mnist_path)# show_mnist(train_images, train_labels)trian_model(train_images, train_labels, test_images, test_labels)12、例子2:cifar10分類
?
?
總結
以上是生活随笔為你收集整理的TensorFlow高阶 API: keras教程-使用tf.keras搭建mnist手写数字识别网络的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Tensorflow 2.0的新特性
 - 下一篇: OpenCV图像缩放resize各种插值