創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!
成都創(chuàng)新互聯(lián)是一家網(wǎng)站設(shè)計公司,集創(chuàng)意、互聯(lián)網(wǎng)應(yīng)用、軟件技術(shù)為一體的創(chuàng)意網(wǎng)站建設(shè)服務(wù)商,主營產(chǎn)品:成都響應(yīng)式網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、成都全網(wǎng)營銷。我們專注企業(yè)品牌在網(wǎng)站中的整體樹立,網(wǎng)絡(luò)互動的體驗,以及在手機(jī)等移動端的優(yōu)質(zhì)呈現(xiàn)。網(wǎng)站設(shè)計制作、成都網(wǎng)站建設(shè)、移動互聯(lián)產(chǎn)品、網(wǎng)絡(luò)運(yùn)營、VI設(shè)計、云產(chǎn)品.運(yùn)維為核心業(yè)務(wù)。為用戶提供一站式解決方案,我們深知市場的競爭激烈,認(rèn)真對待每位客戶,為客戶提供賞析悅目的作品,網(wǎng)站的價值服務(wù)。小編給大家分享一下Dropout在預(yù)測中是不是仍要繼續(xù)發(fā)揮作用,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
因為需要,要重寫訓(xùn)練好的keras模型,雖然只具備預(yù)測功能,但是發(fā)現(xiàn)還是有很多坑要趟過。其中Dropout這個坑,我記憶猶新。
一開始,我以為預(yù)測時要保持和訓(xùn)練時完全一樣的網(wǎng)絡(luò)結(jié)構(gòu),也就是預(yù)測時用的網(wǎng)絡(luò)也是有丟棄的網(wǎng)絡(luò)節(jié)點(diǎn),但是這樣想就掉進(jìn)了一個大坑!因為無法通過已經(jīng)訓(xùn)練好的模型,來獲取其訓(xùn)練時隨機(jī)丟棄的網(wǎng)絡(luò)節(jié)點(diǎn)是那些,這本身就根本不可能。
更重要的是:我發(fā)現(xiàn)每一個迭代周期丟棄的神經(jīng)元也不完全一樣。
假若迭代500次,網(wǎng)絡(luò)共有1000個神經(jīng)元, 在第n(1<= n <500)個迭代周期內(nèi),從1000個神經(jīng)元里隨機(jī)丟棄了200個神經(jīng)元,在n+1個迭代周期內(nèi),會在這1000個神經(jīng)元里(不是在剩余得800個)重新隨機(jī)丟棄200個神經(jīng)元。
訓(xùn)練過程中,使用Dropout,其實就是對部分權(quán)重和偏置在某次迭代訓(xùn)練過程中,不參與計算和更新而已,并不是不再使用這些權(quán)重和偏置了(預(yù)測時,會使用全部的神經(jīng)元,包括使用訓(xùn)練時丟棄的神經(jīng)元)。
也就是說在預(yù)測過程中完全沒有Dropout什么事了,他只是在訓(xùn)練時有用,特別是針對訓(xùn)練集比較小時防止過擬合非常有用。
補(bǔ)充知識:TensorFlow直接使用ckpt模型predict不用restore
我就廢話不多說了,大家還是直接看代碼吧~
# -*- 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的參數(shù),測試時值為1,is_training:0訓(xùn)練參數(shù) 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)