Tensorflow 用訓練好的模型預測


本節涉及點:

  1. 從命令行參數讀取需要預測的數據
  2. 從文件中讀取數據進行預測
  3. 從任意字符串中讀取數據進行預測

一、從命令行參數讀取需要預測的數據

 訓練神經網絡是讓神經網絡具備可用性,真正使用神經網絡時,需要對新的輸入數據進行預測,

 這些輸入數據 不像訓練數據那樣是有目標值(標准答案),而是需要通過神經網絡計算來獲得預測的結果。

 

通過命令行參數輸入數據:

 

import numpy as np
import sys

predictData = None
argt = sys.argv[1:]

# 獲取命令行參數后循環判斷每一個參數,並尋找是否有以“-predict=” 為開始的字符串
# 使用成員函數 startswith 判斷是否以另一個指定的字符串開頭
# 如果有,去掉 "-predict=" 這個前綴,只取后面剩余的字符串
#  tmpStr = v[len("-predict=")] 作用是讓 tmpStr 等於命令行參數v 去掉開頭 "-predict=" 后的字符
# len() 的作用是 獲得任意字符串的長度
# 使用 numpy包中的 fromstring 函數,把 tmpStr 中字符串轉換為一個數組  
for v in argt:
    if v.startswith("-predict="):
        tmpStr = v[len("-predict="):]   #注意這里使用了切片
        print("tmpStr: %s" % tmpStr)
        predictData = np.fromstring(tmpStr, dtype=np.float32, sep=",")

print("predictData: %s" % predictData)

運行結果如下:

 

 使用 Anaconda 執行該程序:

 

# numpy 字符串轉變為數組函數 np.fromstring(tmpStr,dtype=np.float32,sep=",")   

是指將字符串 tmpStr,以字符 "," 為分隔符,轉換為數組內數據項的數據類型是 float32 的數組

 

調用訓練好的神經網絡進行預測:

import tensorflow as tf
import numpy as np
import random
import os
import sys

ifRestartT = False

predictData = None

argt = sys.argv[1:]

for v in argt: if v == "-restart": ifRestartT = True if v.startswith("-predict="): tmpStr = v[len("-predict="):] predictData = np.fromstring(tmpStr, dtype=np.float32, sep=",") print("predictData: %s" % predictData)

trainResultPath = "./save/idcard2"

random.seed()

x = tf.placeholder(tf.float32)
yTrain = tf.placeholder(tf.float32)

w1 = tf.Variable(tf.random_normal([4, 8], mean=0.5, stddev=0.1), dtype=tf.float32)
b1 = tf.Variable(0, dtype=tf.float32)

xr = tf.reshape(x, [1, 4])

n1 = tf.nn.tanh(tf.matmul(xr, w1) + b1)

w2 = tf.Variable(tf.random_normal([8, 2], mean=0.5, stddev=0.1), dtype=tf.float32)
b2 = tf.Variable(0, dtype=tf.float32)

n2 = tf.matmul(n1, w2) + b2

y = tf.nn.softmax(tf.reshape(n2, [2]))

loss = tf.reduce_mean(tf.square(y - yTrain))

optimizer = tf.train.RMSPropOptimizer(0.01)

train = optimizer.minimize(loss)

sess = tf.Session()

if ifRestartT:
    print("force restart...")
    sess.run(tf.global_variables_initializer())
elif os.path.exists(trainResultPath + ".index"):
    print("loading: %s" % trainResultPath)
    tf.train.Saver().restore(sess, save_path=trainResultPath)
else:
    print("train result path not exists: %s" % trainResultPath)
    sess.run(tf.global_variables_initializer())

if predictData is not None: result = sess.run([x, y], feed_dict={x: predictData}) print(result[1]) print(y.eval(session=sess, feed_dict={x: predictData})) #第二種 輸出神經網絡計算結果的方法,解釋見下 sys.exit(0) # 終止程序

# 如果 predictData 的數據 是 “None” ,則繼續訓練
# 否則說明已經從命令行參數中讀取了需要預測的數據,那么就調用神經網絡進行預測,輸出結果 結束程序
lossSum
= 0.0 for i in range(5): xDataRandom = [int(random.random() * 10), int(random.random() * 10), int(random.random() * 10), int(random.random() * 10)] if xDataRandom[2] % 2 == 0: yTrainDataRandom = [0, 1] else: yTrainDataRandom = [1, 0] result = sess.run([train, x, yTrain, y, loss], feed_dict={x: xDataRandom, yTrain: yTrainDataRandom}) lossSum = lossSum + float(result[len(result) - 1]) print("i: %d, loss: %10.10f, avgLoss: %10.10f" % (i, float(result[len(result) - 1]), lossSum / (i + 1))) if os.path.exists("save.txt"): os.remove("save.txt") print("saving...") tf.train.Saver().save(sess, save_path=trainResultPath) resultT = input('Would you like to save? (y/n)') if resultT == "y": print("saving...") tf.train.Saver().save(sess, save_path=trainResultPath)

print(y.eval(session=sess, feed_dict={x: predictData}))

 直接調用張量 y 的 eval 函數,並在命名參數 session 中傳入 會話對象 sess,在命名參數 feed_dict 中傳入需要預測的輸入數據,就可以得到y 的計算結果

 

注意: 用神經網絡計算,不需要傳入目標值 yTrain ,也不需要在 sess.run 函數的結果數組中指定訓練變量 trian

 

 

 

二、從文件中讀取數據進行預測

假設在 程序執行目錄下有此文件 :

 

 

 

import tensorflow as tf
import numpy as np
import random
import os
import sys

ifRestartT = False

predictData = None

argt = sys.argv[1:]
# 同樣,先獲取命令行參數,從前忘后遍歷,如果有 “-file=” ,會從該參數指定的文件中讀取數據
# 讀取數據后放進 predictData 中,但此時, predictData 會是一個二維數組,其中每一行代表文件中的一行數據
# 為了保持一致,我們把用命令行參數 "-predict=" 指定的預測輸入數據也套上了一個方括號變成二維數組【雖然只有一行】
# 使用 predictData.shape[0] 獲取二維數組的行數
# 因為數組的形態本身也是一個數組,其中下標為 0 的數字代表了它的行數
for v in argt:
    if v == "-restart":
        ifRestartT = True
    if v.startswith("-file="):
        tmpStr = v[len("-file="):]
        print(tmpStr)
        predictData = np.loadtxt(tmpStr, dtype=np.float32, delimiter=",")
        predictRowCount = predictData.shape[0] print("predictRowCount: %s" % predictRowCount)
    if v.startswith("-predict="):
        tmpStr = v[len("-predict="):]
        predictData = [np.fromstring(tmpStr, dtype=np.float32, sep=",")]

print("predictData: %s" % predictData)

trainResultPath = "./save/idcard2"

random.seed()

x = tf.placeholder(tf.float32)
yTrain = tf.placeholder(tf.float32)

w1 = tf.Variable(tf.random_normal([4, 8], mean=0.5, stddev=0.1), dtype=tf.float32)
b1 = tf.Variable(0, dtype=tf.float32)

xr = tf.reshape(x, [1, 4])

n1 = tf.nn.tanh(tf.matmul(xr, w1) + b1)

w2 = tf.Variable(tf.random_normal([8, 2], mean=0.5, stddev=0.1), dtype=tf.float32)
b2 = tf.Variable(0, dtype=tf.float32)

n2 = tf.matmul(n1, w2) + b2

y = tf.nn.softmax(tf.reshape(n2, [2]))

loss = tf.reduce_mean(tf.square(y - yTrain))

optimizer = tf.train.RMSPropOptimizer(0.01)

train = optimizer.minimize(loss)

sess = tf.Session()

if ifRestartT:
    print("force restart...")
    sess.run(tf.global_variables_initializer())
elif os.path.exists(trainResultPath + ".index"):
    print("loading: %s" % trainResultPath)
    tf.train.Saver().restore(sess, save_path=trainResultPath)
else:
    print("train result path not exists: %s" % trainResultPath)
    sess.run(tf.global_variables_initializer())

if predictData is not None: for i in range(predictRowCount): print(y.eval(session=sess, feed_dict={x: predictData[i]}))  sys.exit(0) # 用一個循環,把 predictData 中的所有行的數據都輸入神經網絡中計算一邊,最后輸出結果
lossSum = 0.0

for i in range(500000):

    xDataRandom = [int(random.random() * 10), int(random.random() * 10), int(random.random() * 10), int(random.random() * 10)]
    if xDataRandom[2] % 2 == 0:
        yTrainDataRandom = [0, 1]
    else:
        yTrainDataRandom = [1, 0]

    result = sess.run([train, x, yTrain, y, loss], feed_dict={x: xDataRandom, yTrain: yTrainDataRandom})

    lossSum = lossSum + float(result[len(result) - 1])

    print("i: %d, loss: %10.10f, avgLoss: %10.10f" % (i, float(result[len(result) - 1]), lossSum / (i + 1)))

    if os.path.exists("save.txt"):
        os.remove("save.txt")
        print("saving...")
        tf.train.Saver().save(sess, save_path=trainResultPath)

resultT = input('Would you like to save? (y/n)')

if resultT == "y":
    print("saving...")
    tf.train.Saver().save(sess, save_path=trainResultPath)

 

 

 

 就可以 程序從 data2.txt 中獲取了數據並轉換成為一個二維數組,神經網絡載入訓練的過程數據后,根據當時的可變參數取值對每一行數據進行了預測

 

三、從任意字符串中讀取數據進行預測

 

[[1,2,3,4],[2,4,6,8],[5,6,1,2],[7,9,0,3]]

上方是 python 中定義數組的寫法,那么可以用 python 提到的 eval 函數把這個 字符串轉換成為想要的數組類型。

假設有一個文本文件,data3.txt 且 有且僅有 上述字符串作為文件內容,編程實現,從文件中讀取數據進行預測 :

import tensorflow as tf
import numpy as np
import random
import os
import sys

ifRestartT = False

predictData = None

argt = sys.argv[1:]
# 如果制定了命令行參數 "-datafile=”,程序就從指定的文件中讀取文件的全部內容
# 也就是把文件中的內容作為一個大字符串整個讀進變量 fileStr 中
# open 函數是 python 中用於打開指定位置文件的函數,會返回一個文件對象
# 調用該文件對象的 read 函數,就可以把文本文件的內容都讀進來
# 再調用 eval 函數把這個字符串轉換為 python 的數據對象
# 這里,python 會把它轉換成一個 list 對象,直接用 numpy 的 array 函數就可以把它轉換為數組
 
for v in argt:
    if v == "-restart":
        ifRestartT = True
    if v.startswith("-file="):
        tmpStr = v[len("-file="):]
        predictData = np.loadtxt(tmpStr, dtype=np.float32, delimiter=",")
        predictRowCount = predictData.shape[0]
        print("predictRowCount: %s" % predictRowCount)
    if v.startswith("-dataFile="): tmpStr = v[len("-dataFile="):] fileStr = open(tmpStr).read() predictData = np.array(eval(fileStr)) predictRowCount = predictData.shape[0] print("predictRowCount: %s" % predictRowCount) if v.startswith("-predict="):
        tmpStr = v[len("-predict="):]
        predictData = [np.fromstring(tmpStr, dtype=np.float32, sep=",")]

print("predictData: %s" % predictData)

trainResultPath = "./save/idcard2"

random.seed()

x = tf.placeholder(tf.float32)
yTrain = tf.placeholder(tf.float32)

w1 = tf.Variable(tf.random_normal([4, 8], mean=0.5, stddev=0.1), dtype=tf.float32)
b1 = tf.Variable(0, dtype=tf.float32)

xr = tf.reshape(x, [1, 4])

n1 = tf.nn.tanh(tf.matmul(xr, w1) + b1)

w2 = tf.Variable(tf.random_normal([8, 2], mean=0.5, stddev=0.1), dtype=tf.float32)
b2 = tf.Variable(0, dtype=tf.float32)

n2 = tf.matmul(n1, w2) + b2

y = tf.nn.softmax(tf.reshape(n2, [2]))

loss = tf.reduce_mean(tf.square(y - yTrain))

optimizer = tf.train.RMSPropOptimizer(0.01)

train = optimizer.minimize(loss)

sess = tf.Session()

if ifRestartT:
    print("force restart...")
    sess.run(tf.global_variables_initializer())
elif os.path.exists(trainResultPath + ".index"):
    print("loading: %s" % trainResultPath)
    tf.train.Saver().restore(sess, save_path=trainResultPath)
else:
    print("train result path not exists: %s" % trainResultPath)
    sess.run(tf.global_variables_initializer())

if predictData is not None: for i in range(predictRowCount): print(y.eval(session=sess, feed_dict={x: predictData[i]})) sys.exit(0)

lossSum = 0.0

for i in range(500000):

    xDataRandom = [int(random.random() * 10), int(random.random() * 10), int(random.random() * 10), int(random.random() * 10)]
    if xDataRandom[2] % 2 == 0:
        yTrainDataRandom = [0, 1]
    else:
        yTrainDataRandom = [1, 0]

    result = sess.run([train, x, yTrain, y, loss], feed_dict={x: xDataRandom, yTrain: yTrainDataRandom})

    lossSum = lossSum + float(result[len(result) - 1])

    print("i: %d, loss: %10.10f, avgLoss: %10.10f" % (i, float(result[len(result) - 1]), lossSum / (i + 1)))

    if os.path.exists("save.txt"):
        os.remove("save.txt")
        print("saving...")
        tf.train.Saver().save(sess, save_path=trainResultPath)

resultT = input('Would you like to save? (y/n)')

if resultT == "y":
    print("saving...")
    tf.train.Saver().save(sess, save_path=trainResultPath)

 

 執行程序:

 

 

 

 

當然,這里的格式也符合網絡間傳遞數據的最常用的格式之一: JSON


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM