1.導入數據,讀取數據:Datasets
2.構建神經網絡:Model層
3.編譯模型(設置怎麼訓練模式):model.compile
4.訓練模型:model.fit()
5.評估模型準確性:model.evaluate()
6.建議做的步驟:將訓練好的模型保留到本地,優秀的模型,下次可以直接從本地加載,就不用費時間再去訓練了
model.save()
model= tf.keras.models.load_model()
7.畫圖 Plot
代碼步驟如下:
import tensorflow as tf
import os
import numpy as np
# 畫圖
import matplotlib.pyplot as plt
# 防止Tensorflow運行GPU內存不足造成錯誤
from tensorflow.compat.v1 import ConfigProto
from tensorflow.compat.v1 import InteractiveSession
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ['CUDA_VISIBLE_DEVICES'] = "-1" #選擇哪一塊gpu,如果是-1,就是調用cpu
config = ConfigProto()
config.allow_soft_placement=True #如果你指定的設備不存在,允許TF自動分配設備
config.gpu_options.per_process_gpu_memory_fraction=0.7 #分配百分之七十的顯存給程序使用,避免內存溢出,可以自己調整
config.gpu_options.allow_growth = True #按需分配顯存,這個比較重要
session = InteractiveSession(config=config)
# 取消打印一些tensorflow的警告
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"
# 數據處理
(x_train,y_train),(x_test,y_test) = tf.keras.datasets.mnist.load_data()
# 處理訓練數據和測試數據 -- 需要將圖片數據處理成浮點型
x_train,x_test = x_train / 1.0, x_test / 1.0
# 將二維數據轉換層3維數據,CNN只支持三維的計算 (60000,28,28) -- > (60000,28,28,1) print(x_train.shape)
x_train = x_train.reshape(-1,28,28,1)
x_test = x_test.reshape(-1,28,28,1)
# 訓練模型
model = tf.keras.models.Sequential([
# 設置訓練模型 -- input_shape 指出輸入的形狀(samples,rows,cols,channels) ,只指出後三維即可,第一維度按batch_size自動指定
# x_train (60000,28,28,1) >> input_shape=(60000,28,28,1) 第一維可以省略,自動根據batch_size指定
tf.keras.layers.Conv2D(filters=16,kernel_size=(5,5),activation="relu",input_shape=(28,28,1),padding="valid"),
tf.keras.layers.MaxPool2D(pool_size=(2,2)),
tf.keras.layers.Conv2D(filters=32,kernel_size=(5,5),activation="relu"),
tf.keras.layers.MaxPool2D(pool_size=(2,2)),
tf.keras.layers.Conv2D(filters=64,kernel_size=(3,3),activation="relu",padding="valid"),
tf.keras.layers.MaxPool2D(pool_size=(2,2)),
# 打平層,將三維數據打平成1維矩陣
tf.keras.layers.Flatten(),
# 全連接層,降維,將28*28=784一維數據轉化成最後要分類數量,如mnist數據集10類
tf.keras.layers.Dense(256,activation="relu"),
tf.keras.layers.Dense(128,activation="relu"),
tf.keras.layers.Dense(64,activation="relu"),
tf.keras.layers.Dense(32,activation="relu"),
tf.keras.layers.Dense(10,activation="softmax")
])
# 編譯模型
model.compile(
optimizer='adam',
# loss=tf.keras.losses.sparse_categorical_crossentropy,
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
# 訓練模型-並記錄訓練模型
his = model.fit(x_train,y_train,batch_size=128,epochs=30)
# 評估模型
test_loss,test_accurary = model.evaluate(x_test,y_test)
print(test_loss,test_accurary)
# 保存訓練模型
model.save("D:\\ResearchModel\\mnistCNN.h5")
# 如果本地有訓練好的模型,可以直接通過加載本地訓練好的model進行後續訓練
# model = tf.keras.models.load_model("D:\\ResearchModel\\mnistCNN.h5")
# 評估模型
test_loss,test_accurary = model.evaluate(x_test,y_test)
print(test_loss,test_accurary)
# 模型歸檔
model.summary()
# 畫圖
plt.plot(his.history['accuracy'])
plt.title("Accuracy Model")
plt.xlabel("Epoch")
plt.ylabel("Accuracy")
plt.legend(["accuracy"],loc="lower right")
plt.show()