【深度学习】(6) tensorflow2.0使用keras高层API
各位同學好,今天和大家分享一下TensorFlow2.0深度學習中借助keras的接口減少神經網絡代碼量。主要內容有:
1. metrics指標;2. compile 模型配置;3. fit 模型訓練;4. evaluate 模型評估;5. predict 預測;6. 自定義網絡
1. metrics 性能指標
加權平均值:?tf.keras.metrics.Mean
預測值和真實值的準確度:?tf.keras.metrics.Accuracy
1.1 新建一個metrics指標
準確度指標?metrics.Accuracy()?一般用于訓練集,加權平均值 metrics.Mean() ?一般用于測試集
# 新建準確度指標
acc_meter = metrics.Accuracy()
# 新建平均值指標
mean_meter = metrics.Mean()
1.2 向metrics添加數據
添加數據:update_state()。每一次迭代,都向準確率指標中添加測試數據的真實值和測試數據的預測值,將準確率保存在緩存區,需要時取出來。向平均損失指標中添加每一次訓練產生的損失,每添加進來一個值就計算加權平均值,sample_weight指定每一項的權重,將結果保存在緩存區,需要時取出來。
# 計算真實值和預測值之間的準確度
acc_meter.update_state(y_true, predict)
# 計算平均損失
mean_meter = mean_meter.update_state(loss, sample_weight=None)
1.3 從metrics中取出數據
取出數據:result().numpy()。result()返回tensor類型數據,轉換成numpy()類型的數據。
# 取出準確率
acc_meter.result().numpy()
# 取出訓練集的損失值的均值
mean_meter.result().numpy()
1.4 清空緩存
清空緩存:reset_states()。每一次循環緩存區都會將之前的數據保存,在開始第二次循環之前,應該把緩存區清空,重新讀入數據。
# 清空準確率的緩存
acc_meter.reset_states()
# 清空加權均值的緩存
mean_meter.reset_states()
2. compile 模型配置
compile(optimizer, loss, metrics, loss_weights)
參數設置:
optimizer: 用來配置模型的優化器,可以調用tf.keras.optimizers API配置模型所需要的優化器。
loss: 用來配置模型的損失函數,可以通過名稱調用tf.losses API中已經定義好的loss函數。
metrics: 用來配置模型評價的方法,模型訓練和測試過程中的度量指標,如accuracy、mse等
loss_weights: float類型,損失加權系數,總損失是所有損失的加權和,它的元素個數和模型的輸出數量是1比1的關系。
# 選擇優化器Adam,loss為交叉熵損失,測試集評價指標accurancy
network.compile(optimizer=optimizers.Adam(lr=0.01), #學習率0.01loss = tf.losses.CategoricalCrossentropy(from_logits=True),metrics = ['accuracy'])
3. fit 模型訓練
fit(x, y, batch_size, epochs, validation_split, validation_data, shuffle,?validation_freq)
參數:
x: 訓練集的輸入數據,可以是array或者tensor類型。
y: 訓練集的目標數據,可以是array或者tensor類型。
batch_size:每一個batch的大小,默認32
epochs: 迭代次數
validation_split:配置測試集數據占訓練數據集的比例,取值范圍為0~1。
validation_data: 配置測試集數據(輸入特征及目標)。如果已經配置validation_split參數,則可以不配置該參數。如果同時配置validation_split和validation_data參數,那么validation_split參數的配置將會失效。
shuffle:配置是否隨機打亂訓練數據。當配置steps_per_epoch為None時,本參數的配置失效。
validation_freq: 每多少次循環做一次測試
# ds為包含輸入特征及目標的數據集
network.fit(ds, eopchs=20, validation_data=ds_val, validation_freq=2)
# validation_data給定測試集,validation_freq每多少次大循環做一次測試,測試時自動計算準確率
4.?evaluate 模型評估
evaluate(x, y, batch_size, sample_weight, steps)
返回模型的損失及準確率等相關指標
參數:
x: 輸入測試集特征數據
y:測試集的目標數據
batch_size: 整數或None。每個梯度更新的樣本數。如果未指定,batch_size將默認為32。如果數據采用數據集,生成器形式,則不要指定batch_size。
sample_weight: 測試樣本的可選Numpy權重數組,用于加權損失函數。
steps: 整數或None。宣布評估階段結束之前的步驟總數。
5. predict 預測
predict(x, batch_size,?steps)
參數:
x: numpy類型,tensor類型。預測所需的特征數據
batch_size: 每個梯度更新的樣本數。如果未指定,batch_size將默認為32
steps: 整數或None,宣布預測回合完成之前的步驟總數(樣本批次)。
等同于:
sample = next(iter(ds_pred)) # 每次從驗證數據中取出一組batch
x = sample[0] # x 保存第0組驗證集特征值
pred = network.predict(x) # 獲取每一個分類的預測結果
pred = tf.argmax(pred, axis=1) # 獲取值最大的所在的下標即預測分類的結果
print(pred)
6. sequential
Sequential模型適用于簡單堆疊網絡層,即每一層只有一個輸入和一個輸出。
# ==1== 設置全連接層
# [b,784]=>[b,256]=>[b,128]=>[b,64]=>[b,32]=>[b,10],中間層一般從大到小降維
network = Sequential([layers.Dense(256, activation='relu'), #第一個連接層,輸出256個特征layers.Dense(128, activation='relu'), #第二個連接層layers.Dense(64, activation='relu'), #第三個連接層layers.Dense(32, activation='relu'), #第四個連接層layers.Dense(10), #最后一層不需要激活函數,輸出10個分類])
# ==2== 設置輸入層維度
network.build(input_shape=[None, 28*28])
# ==3== 查看網絡結構
network.summary()
# ==4== 查看網絡的所有權重和偏置
network.trainable_variables
# ==5== 自動把x從第一層傳到最后一層
network.call()
7. 自定義層構建網絡
通過對 tf.keras.Model 進行子類化并定義自己的前向傳播模型。在 __init__ 方法中創建層并將它們設置為類實例的屬性。在 call 方法中定義前向傳播。
# 自定義Dense層
class MyDense(layers.Layer): #必須繼承layers.Layer層,放到sequential容器中# 初始化方法def __int__(self, input_dim, output_dim):super(MyDense, self).__init__() # 調用母類初始化,必須# 自己發揮'w''b'指定名字沒什么用,創建shape為[input_dim, output_dim的權重# 使用add_variable創建變量self.kernel = self.add_variable('w', [input_dim, output_dim])self.bias = self.add_variable('b', [output_dim])# call方法,training來指示現在是訓練還是測試def call(self, inputs, training=None):out = inputs @ self.kernel + self.biasreturn out# 自定義層來創建網絡
class MyModel(keras.Model): # 必須繼承keras.Model大類,才能使用complie、fit等功能# def __init__(self):super(MyModel, self).__init__() # 調用父類Mymodel# 使用自定義層創建5層self.fc1 = MyDense(28*28,256) #input_dim=784,output_dim=256self.fc2 = MyDense(256,128)self.fc3 = MyDense(128,64)self.fc4 = MyDense(64,32)self.fc5 = MyDense(32,10)def call(self, inputs, training=None):# x從輸入層到輸出層x = self.fc1(inputs)x = tf.nn.relu(x)x = self.fc2(x)x = tf.nn.relu(x) x = self.fc3(x)x = tf.nn.relu(x)x = self.fc4(x)x = tf.nn.relu(x)x = self.fc5(x) #logits層return x
總結
以上是生活随笔為你收集整理的【深度学习】(6) tensorflow2.0使用keras高层API的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【深度学习】(5) 简单网络,案例:服装
- 下一篇: 【深度学习】(7) 交叉验证、正则化,自