在前面,我們使用了全連接、神經網絡、卷積神經網絡等一些深度學習模型做了一些簡單的應用,那麼使用這些模型中,訓練得到的結果如何保存,並如何用它們來對實際的使用作出貢獻呢。#
如何在深度學習中保存訓練模型
在TensorFlow中,主要使用tf.train.Saver()來完成模型的保存。主要的步驟如下:
1、設置保存模型的目錄。
我們在本地設置一個叫做ckpt的文件夾來保存模型CKPT_DIR='ckpt'
2、在模型保存文件中讀取狀態ckpt = tf.train.get_checkpoint_state(CKPT_DIR)
3、定義一個saver,即保存模型的對象。saver=tf.train.Saver()
4、如果在保存模型裏已經有一部分訓練模型結果,那麼恢復出來。
if ckpt and ckpt.model_checkpoint_path:
saver.restore(sess,ckpt.model_checkpoint_path)
5、經過一定輪數的訓練後保存訓練模型
saver.save(sess,CKPT_DIR+'/model',global_step=i)
如此這樣,我們就可以把訓練模型結果保存在ckpt文件夾了。
深度學習中保存訓練模型實例
下面我們通過實例展示一下如何保存訓練模型,我們使用多隱層來訓練手寫數字識別,其具體算法可以見之前的博客https://blog.csdn.net/weixin_45690272/article/details/102964406的"多隱藏層神經網絡手寫數字識別"一節。那麼,在保存訓練模型中,根據前一節步驟具體代碼如下:
import warnings
warnings.filterwarnings('ignore')
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
CKPT_DIR='ckpt'
mnist_data=input_data.read_data_sets('mnist_data/',one_hot=True) #獲取mnist數據
#設置超參數
batch_size=100 #每一輪數據量大小
learning_rate=0.8 #初始學習率
learning_rate_decay=0.999 #學習率的衰減
max_steps=1000 #最大訓練步數
training_step=tf.Variable(0,trainable=False)
#定義隱藏層函數
def hidden_layer(input_tensor,weights1,biases1,weights2,biases2,layer_name):
layer1=tf.nn.relu(tf.matmul(input_tensor,weights1)+biases1) #第一層隱藏層採用了relu激活函數
return tf.matmul(layer1,weights2)+biases2 #第二層沒有采用激活函數,即輸出層
x=tf.placeholder(tf.float32,[None,784]) #訓練數據集的輸入,有784維個特徵
y_=tf.placeholder(tf.float32,[None,10]) #訓練數據的標籤,10分類
weights1=tf.Variable(tf.truncated_normal([784,500],stddev=0.1),name='weight1') #權重1
biases1=tf.Variable(tf.truncated_normal([1,500],stddev=0.1),name='biases1' ) #偏值1
weights2=tf.Variable(tf.truncated_normal([500,10],stddev=0.1),name='weight2') #權重2
biases2=tf.Variable(tf.truncated_normal([1,10],stddev=0.1),name='biases2') #偏值2
y=hidden_layer(x,weights1,biases1,weights2,biases2,'y') #訓練數據經過計算之後的結果。
#參數更新
averages_class=tf.train.ExponentialMovingAverage(0.99,training_step)
averages_op=averages_class.apply(tf.trainable_variables())
average_y=hidden_layer(x,averages_class.average(weights1),
averages_class.average(biases1),
averages_class.average(weights2),
averages_class.average(biases2),
'average_y')
#交叉熵
cross_entropy=tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argmax(y_,1))
#正則化
regular=tf.contrib.layers.l2_regularizer(0.0001)
regulation=regular(weights1)+regular(weights2)
#總的損失函數
loss=tf.reduce_mean(cross_entropy)+regulation
#學習率更新
learning_rate=tf.train.exponential_decay(learning_rate,training_step,mnist_data.train.num_examples/batch_size,learning_rate_decay)
train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=training_step)
# train_op=tf.group(train_step)
with tf.control_dependencies([train_step,averages_op]):
train_op=tf.no_op(name='train')
#評估模型
init=tf.global_variables_initializer()
correct_prediction = tf.equal(tf.argmax(average_y, 1), tf.argmax(y_, 1)) # 這行代碼的目的是對比預測值y與標籤y_是否匹配
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
# 這行代碼會給我們一組布爾值。爲了確定正確預測項的比例,我們可以把布爾值轉換成浮點數,然後取平均值。例如,[True, False, True, True] 會變成 [1,0,1,1] ,取平均值後得到 0.75.
with tf.Session() as sess:
sess.run(init)
validate_feed={x:mnist_data.validation.images,y_:mnist_data.validation.labels}
test_feed={x:mnist_data.test.images,y_:mnist_data.test.labels}
ckpt = tf.train.get_checkpoint_state(CKPT_DIR)
saver=tf.train.Saver()
if ckpt and ckpt.model_checkpoint_path:
saver.restore(sess,ckpt.model_checkpoint_path)
for i in range(max_steps):
if i % 100 == 0:
validate_accuracy=sess.run(accuracy, feed_dict=validate_feed)
print('validate_accuracy',validate_accuracy)
saver.save(sess,CKPT_DIR+'/model',global_step=i)
batch_x,batch_y=mnist_data.train.next_batch(batch_size)
sess.run(train_op,feed_dict={x:batch_x, y_:batch_y})
print(' accuracy is ',sess.run(accuracy, feed_dict=test_feed)) # 評估模型準確率
可以在代碼中尋找步驟所添加的代碼。運行結果準確率達到98%。accuracy is 0.9809
。而模型的保存情況見如下目錄:
如何使用訓練模型來做實際的預測
保存了訓練模型之後,是用來具體使用的那麼如何使用呢。具體步驟是
1、讀取訓練模型
ckpt = tf.train.get_checkpoint_state(CKPT_DIR)
saver = tf.train.Saver()
if ckpt and ckpt.model_checkpoint_path:
saver.restore(sess, ckpt.model_checkpoint_path)
2、加載被預測信息
image_path='D:/AITFPy/tfLearing/test_images/4.png'
img=Image.open(image_path).convert('L')
flatten_img=np.reshape(img,784)
x_predict=np.array([1-flatten_img])
3、把被預測信息放入到模型計算,然後獲得結果
y_predict=sess.run(y,feed_dict={x:x_predict})
4、對比試驗結果。
現在我們來測試如下手寫數字識別的0和4
具體代碼如下
from PIL import Image
import numpy as np
import tensorflow as tf
CKPT_DIR='ckpt'
def hidden_layer(input_tensor,weights1,biases1,weights2,biases2,layer_name):
layer1=tf.nn.relu(tf.matmul(input_tensor,weights1)+biases1) #第一層隱藏層採用了relu激活函數
return tf.matmul(layer1,weights2)+biases2 #第二層沒有采用激活函數,即輸出層
x=tf.placeholder(tf.float32,[None,784]) #訓練數據集的輸入,有784維個特徵
y_=tf.placeholder(tf.float32,[None,10]) #訓練數據的標籤,10分類
weights1=tf.Variable(tf.truncated_normal([784,500],stddev=0.1),name='weight1') #權重1
biases1=tf.Variable(tf.truncated_normal([1,500],stddev=0.1),name='biases1' ) #偏值1
weights2=tf.Variable(tf.truncated_normal([500,10],stddev=0.1),name='weight2') #權重2
biases2=tf.Variable(tf.truncated_normal([1,10],stddev=0.1),name='biases2') #偏值2
y=hidden_layer(x,weights1,biases1,weights2,biases2,'y') #訓練數據經過計算之後的結果。
init=tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
ckpt = tf.train.get_checkpoint_state(CKPT_DIR)
saver = tf.train.Saver()
if ckpt and ckpt.model_checkpoint_path:
saver.restore(sess, ckpt.model_checkpoint_path)
else:
raise FileNotFoundError("未保存任何模型")
image_path='D:/AITFPy/tfLearing/test_images/4.png'
img=Image.open(image_path).convert('L')
flatten_img=np.reshape(img,784)
x_predict=np.array([1-flatten_img])
y_predict=sess.run(y,feed_dict={x:x_predict})
print(image_path)
print("predict number is ",np.argmax(y_predict[0]))
運行結果如下:
D:/AITFPy/tfLearing/test_images/4.png
predict number is 4
同樣的,我們對0進行預測,結果也很理想。