zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    mdk3 工具使用-表白神器
    Crunch黑客神器-创造个性字典
    centos 自动挂载ISO
    渗透测试工具Nmap从初级到高级
    mui 点击长按复制文本
    JavaScript倒计时并刷新页面
    javascript单一复制粘贴
    jquery定义链接跳转的高亮显示
    JS判断移动端访问设备并加载对应CSS样式
    jquery刷新数据随机排列
  • 原文地址:https://www.cnblogs.com/expedition/p/11650613.html
Copyright © 2011-2022 走看看