TensorFlow(6)神经网络训练(DNN)
目錄
Fashion MNIST數據集
一、獲取Mnist數據集
二、加載數據集
三、數據歸一化
四、設計神經網絡模型
五、模型編譯&&訓練
5-1、編譯?
5-2、訓練
六、模型評估
七、模型預測
1、?對全部測試集分類
2、獲取某一個分類的結果
3、顯示預測結果
八、防止過擬合
總代碼
Fashion MNIST數據集
?
?輸入的每個值經過每一個神經元。
一、獲取Mnist數據集
# 1、獲取Fashion Mnist數據集
mnist = tf.keras.datasets.fashion_mnist
print(mnist)
二、加載數據集
# 2、加載數據集
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
# 查看數據集
import matplotlib.pyplot as plt
print(training_images)
print(training_labels)
print(test_images)
print(test_labels)
plt.imshow(training_images[0])
三、數據歸一化
數據歸一化,把數據區間定位到[0,1]。
# 3、數據歸一化
training_images = training_images / 255.0
test_images = test_images / 255.0
# print(training_images)
# print(test_images)
四、設計神經網絡模型
設計神經網絡模型(輸入層、隱藏層、輸出層)。
# 4、設計神經網絡模型(分類)
model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), #輸入層tf.keras.layers.Dense(128, activation=tf.nn.relu), #隱藏層 神經元數量 激活函數tf.keras.layers.Dense(10, activation=tf.nn.softmax)])#輸出層 輸出特征數量 激活函數
每一層神經元都需要一個激活函數 activation:告訴它們輸出什么。有很多選項,但目前只用這些(relu和softmax)。
Relu激活函數: "如果X>0返回X,否則返回0"--所以它的作用是它只把大于0的值傳遞給網絡中的下一層,小于0的也當作0。
Softmax激活函數:接收到一組值后,選擇其中最大的一個輸出。例如,上一層的輸出為[0.1, 0.1, 0.05, 0.1, 9.5, 0.1, 0.05, 0.05, 0.05],Softmax就省去了你在其中尋找最大的值,并把它變成[0,0,0,0,0,1,0,0,0,0,0] **Softmax**的意思是 "如果X>0,則返回X,否則返回0" -- 所以它的作用是只把0或更大的值傳給下一層的網絡。--其目的是節省大量的編碼!
得到的模型:?
五、模型編譯&&訓練
5-1、編譯?
# 5-1、編譯
model.compile(optimizer = tf.optimizers.Adam(), loss = 'sparse_categorical_crossentropy', metrics=['accuracy'])
# 編譯 優化器 損失函數 交叉熵損失函數 監控
# 優化器:Adam優化算法(尋找全局最優點)
# 損失函數:交叉熵損失函數(用來評估當前訓練得到的概率分布與真實分布的差異情況)
5-2、訓練
# 5-2、訓練
model.fit(training_images, training_labels, epochs=5)
# 訓練特征集 訓練目標集 執行5次
六、模型評估
# 6、模型評估
model.evaluate(test_images, test_labels)
????????對沒有訓練過的數據測試時,可以發現,準確率有所降低,模型對于未見過的數據,可能不會像見過的數據那樣處理的那么好。
七、模型預測
1、?對全部測試集分類
# 1、得到全部分類預測
classification = model.predict(test_images)
2、獲取某一個分類的結果
# 2、獲取某一個分類的結果(最大概率值即為預測結果)
print('單圖各標簽的概率:', classification[0])
result = np.argmax(classification[0])
3、顯示預測結果
# 顯示結果
print('預測結果:', result)
print('真實結果:', test_labels[0])
plt.imshow(test_images[0])
八、防止過擬合
在訓練的過程中,不希望出現過擬合的情況。
設置誤差小于0.4的時候停止訓練。?
# 定義終止訓練的函數,myCallback這個類繼承了tf.keras.callbacks.Callback
class myCallback(tf.keras.callbacks.Callback):def on_epoch_end(self,epoch,logs={}):if(logs.get('loss')<0.4): #損失小于0.4時終止訓練print('\loss is low so cancelling training!')self.model.stop_training = True
# 5-2、訓練
model.fit(training_images, training_labels, epochs=5, callbacks=[myCallback()])
# 訓練特征集 訓練目標集 執行5次 回調函數
防止過擬合。?
總代碼
import tensorflow as tf
print(tf.__version__)# 1、獲取Fashion Mnist數據集
mnist = tf.keras.datasets.fashion_mnist
# print(mnist)# 2、加載數據集
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
# 查看數據集
# import matplotlib.pyplot as plt
# print(training_images)
# print(training_labels)
# print(test_images)
# print(test_labels)
# plt.imshow(training_images[0])# 3、數據歸一化
training_images = training_images / 255.0
test_images = test_images / 255.0
# print(training_images)
# print(test_images)# 4、設計神經網絡模型(分類)
# 定義終止訓練的函數,myCallback這個類繼承了tf.keras.callbacks.Callback
class myCallback(tf.keras.callbacks.Callback):def on_epoch_end(self,epoch,logs={}):if(logs.get('loss')<0.4): #損失小于0.4時終止訓練print('\loss is low so cancelling training!')self.model.stop_training = Truemodel = tf.keras.models.Sequential([tf.keras.layers.Flatten(input_shape=(28,28)), #輸入層tf.keras.layers.Dense(128, activation=tf.nn.relu), #隱藏層 神經元數量 激活函數tf.keras.layers.Dense(10, activation=tf.nn.softmax)])#輸出層 輸出特征數量 激活函數
model.build((None,90, 7))
model.summary()# 5、編譯&&訓練
# 5-1、編譯
model.compile(optimizer = tf.optimizers.Adam(), loss = 'sparse_categorical_crossentropy', metrics=['accuracy'])
# 編譯 優化器 損失函數 交叉熵損失函數 監控
# 優化器:Adam優化算法(尋找全局最優點)
# 損失函數:交叉熵損失函數(用來評估當前訓練得到的概率分布與真實分布的差異情況)# 5-2、訓練
model.fit(training_images, training_labels, epochs=5, callbacks=[myCallback()])
# 訓練特征集 訓練目標集 執行5次 回調函數# 6、模型評估
model.evaluate(test_images, test_labels)# 7、模型預測
import numpy as np
import matplotlib.pyplot as plt
# 預測單圖片
# 1、得到全部分類預測
classification = model.predict(test_images)
# 2、獲取某一個分類的結果(最大概率值即為預測結果)
print('單圖各標簽的概率:', classification[0])
result = np.argmax(classification[0])
# 顯示結果
print('預測結果:', result)
print('真實結果:', test_labels[0])
plt.imshow(test_images[0])
總結
以上是生活随笔為你收集整理的TensorFlow(6)神经网络训练(DNN)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习(5)感知机(神经元)与神经网络
- 下一篇: TensorFlow(7)卷积神经网络实