因為需要,要重寫訓練好的keras模型,雖然只具備預測功能,但是發現還是有很多坑要趟過。其中Dropout這個坑,我記憶猶新。
一開始,我以為預測時要保持和訓練時完全一樣的網絡結構,也就是預測時用的網絡也是有丟棄的網絡節點,但是這樣想就掉進了一個大坑!因為無法通過已經訓練好的模型,來獲取其訓練時隨機丟棄的網絡節點是那些,這本身就根本不可能。
更重要的是:我發現每一個迭代周期丟棄的神經元也不完全一樣。
假若迭代500次,網絡共有1000個神經元, 在第n(1<= n <500)個迭代周期內,從1000個神經元里隨機丟棄了200個神經元,在n+1個迭代周期內,會在這1000個神經元里(不是在剩余得800個)重新隨機丟棄200個神經元。
訓練過程中,使用Dropout,其實就是對部分權重和偏置在某次迭代訓練過程中,不參與計算和更新而已,并不是不再使用這些權重和偏置了(預測時,會使用全部的神經元,包括使用訓練時丟棄的神經元)。
也就是說在預測過程中完全沒有Dropout什么事了,他只是在訓練時有用,特別是針對訓練集比較小時防止過擬合非常有用。
補充知識:TensorFlow直接使用ckpt模型predict不用restore
我就廢話不多說了,大家還是直接看代碼吧~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
# -*- coding: utf-8 -*- # from util import * import cv2 import numpy as np import tensorflow as tf # from tensorflow.python.framework import graph_util import os os.environ[ 'CUDA_DEVICE_ORDER' ] = 'PCI_BUS_ID' os.environ[ 'CUDA_VISIBLE_DEVICES' ] = '0' image_path = './8760.pgm' input_checkpoint = './model/xu_spatial_model_1340.ckpt' sess = tf.Session() saver = tf.train.import_meta_graph(input_checkpoint + '.meta' ) saver.restore(sess, input_checkpoint) # input:0作為輸入圖像,keep_prob:0作為dropout的參數,測試時值為1,is_training:0訓練參數 input_image_tensor = sess.graph.get_tensor_by_name( "coef_input:0" ) is_training = sess.graph.get_tensor_by_name( 'is_training:0' ) batch_size = sess.graph.get_tensor_by_name( 'batch_size:0' ) # 定義輸出的張量名稱 output_tensor_name = sess.graph.get_tensor_by_name( "xuNet/logits:0" ) # xuNet/Logits/logits image = cv2.imread(image_path, 0 ) # 讀取測試圖片 out = sess.run(output_tensor_name, feed_dict = {input_image_tensor: np.reshape(image, ( 1 , 512 , 512 , 1 )), is_training: False , batch_size: 1 }) print (out) |
ckpt模型中的所有節點名稱,可以這樣查看
[n.name for n in tf.get_default_graph().as_graph_def().node]
以上這篇淺談keras中Dropout在預測過程中是否仍要起作用就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/zyl681327/article/details/95597687