本節涉及點:
- 從命令行參數讀取需要預測的數據
- 從文件中讀取數據進行預測
- 從任意字符串中讀取數據進行預測
一、從命令行參數讀取需要預測的數據
訓練神經網絡是讓神經網絡具備可用性,真正使用神經網絡時,需要對新的輸入數據進行預測,
這些輸入數據 不像訓練數據那樣是有目標值(標准答案),而是需要通過神經網絡計算來獲得預測的結果。
通過命令行參數輸入數據:
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