TensorFlow實操之—保存訓練模型,並用訓練模型進行實際預測應用


在前面,我們使用了全連接、神經網絡、卷積神經網絡等一些深度學習模型做了一些簡單的應用,那麼使用這些模型中,訓練得到的結果如何保存,並如何用它們來對實際的使用作出貢獻呢。#

如何在深度學習中保存訓練模型

在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進行預測,結果也很理想。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章