[Python 人工智能预测] 基于TensorFlow的神经网络模版

摘要

本文总结了神经网络预测的代码实现模版, 包括数据定义部分、前向传播定义部分、反向传播定义部分、运算部分.这里没有使用真实的数据集, 可实现简单的回归预测, 也可以进行简单的二分类预测. 如有讲解不当或不明的地方,欢迎指正与讨论.

Wechat: W1474317529

相关依赖

numpy, TensorFlow, pandas, os

import部分

import os  
# os.environ["TF_CPP_MIN_LOG_LEVEL"]='1' # 这是默认的显示等级,显示所有信息  
os.environ["TF_CPP_MIN_LOG_LEVEL"]='2' # 只显示 warning 和 Error   
# os.environ["TF_CPP_MIN_LOG_LEVEL"]='3' # 只显示 Error 
#coding:utf-8
import tensorflow as tf
import numpy as np
import pandas as pd

笔者使用的是TensorFlow的CPU版本, 如使用GPU版本可忽略os的import.

os.environ部分是防止因cpu性能较低而导致的运行失败, 实际使用时酌情添加.

数据定义部分

X = searchX() #42*720
Y = searchY() #42*720
print("Shape of X:\n", X.shape)
print("Shape of Y:\n", Y.shape)

x = tf.placeholder(tf.float32, shape=(None, 720))
y_ = tf.placeholder(tf.float32, shape=(None, 720))

w1 = tf.Variable(tf.random_normal([720, 3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3, 3], stddev=1, seed=1))
w3 = tf.Variable(tf.random_normal([3, 720], stddev=1, seed=1))

这里不涵盖数据的清洗与导入.笔者使用的是1行720列的矩阵数据作为输入, 1行720列的矩阵数据作为预测输出, 此处使用searchX与searchY(是自己写的脚本函数)生成了数据集, 实际使用时用pd.read_csv或np.load导入自己的数据即可.

x与y_则是运算过程中的输入与预测输出, 使用placeholder占位以方便后续批量喂入数据, 占位定义shape=none, 720是因为笔者的数据shape为1*720, none表示先不给定有多少组数据. 例如,用零件质量和体积分析零件合格性,那么x的shape应为(None, 2), 即每个数据是一行两列的矩阵, 而y_的shape应为(none, 1), 即每个预测结果应为1行1列的矩阵(即一个数字来表示合格与否).

w1, w2, w3则是隐藏层(hidden层)的权重系数矩阵, 此处为2层隐藏层, 每个隐藏层有3个神经元的RBF模型, 权重系数矩阵的生成此处使用了random_normal函数,即正态分布, 后续写定了标准差为1. 此处为了后续调参观察性能的方便, 给定了seed.

前向传播计算过程定义


a = tf.matmul(x, w1)
b = tf.matmul(a, w2)
y = tf.matmul(b, w3)

此处为2层隐藏层, 每个隐藏层有3个神经元的RBF模型, 至于w2为什么是3*3的阵, 则是简单的矩阵相乘知识, 此处不赘述

反向传播计算过程定义(参数优化)

loss = tf.reduce_mean(tf.square(y-y_))
train_step = tf.train.AdamOptimizer(0.2).minimize(loss)

此处使用均方差作为损失函数loss, train_step使用了AdamOptimizer优化器, 0.2为学习率, 目的为minimize损失函数loss.实际过程中学习率应在0.01左右.由于笔者的数据量较少, 设置为了0.2. 实际过程可以考虑使用其他优化器.

开始训练过程


BATCHE_SIZE = 3

with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op) #初始化参数
    print("\n")
    print("w1:\n", sess.run(w1))
    print("w2:\n", sess.run(w2))
    print("w3:\n", sess.run(w3))
    STEPS = 3000
    for i in range(STEPS):
        start = (i*BATCH_SIZE)
        end = start + BATCH_SIZE
        sess.run(train_step, feed_dict = {x: X[start:end], y_: Y[start:end]})
    total_loss = sess.run(loss, feed_dict = {x:X, y_:Y})
    print("\n")
    print(total_loss)
    print("\n")
    print("w1:\n", sess.run(w1))
    print("w2:\n", sess.run(w2))
    print("w3:\n", sess.run(w3))

BATCHE_SIZE表示每轮训练喂入的数据组数, 需要调整, 不宜过大.

此处STEPS设置为3000轮, 每一轮循环喂入数据, 应注意的是, 数据总量应为BATCH_SIZE的整数倍, 例如笔者共有42组数据, BATCH_SIZE可设置为1, 2, 3, 4, 6, 7, 13, 21

total_loss则为总均方差, 表征了训练模型的准确程度, 而训练后的w1, w2, w3则可以dump下来以用新的数据验证预测模型性能.

全部代码如下

import os  
# os.environ["TF_CPP_MIN_LOG_LEVEL"]='1' # 这是默认的显示等级,显示所有信息  
os.environ["TF_CPP_MIN_LOG_LEVEL"]='2' # 只显示 warning 和 Error   
# os.environ["TF_CPP_MIN_LOG_LEVEL"]='3' # 只显示 Error 
#coding:utf-8
import tensorflow as tf
import numpy as np
import pandas as pd
from test1 import searchX, searchY
BATCH_SIZE = 2


X = searchX() #42*720
Y = searchY() #42*720
print("Shape of X:\n", X.shape)
print("Shape of Y:\n", Y.shape)

x = tf.placeholder(tf.float32, shape=(None, 720))
y_ = tf.placeholder(tf.float32, shape=(None, 720))

w1 = tf.Variable(tf.random_normal([720, 3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3, 3], stddev=1, seed=1))
w3 = tf.Variable(tf.random_normal([3, 720], stddev=1, seed=1))

a = tf.matmul(x, w1)
b = tf.matmul(a, w2)
y = tf.matmul(c, w3)

loss = tf.reduce_mean(tf.square(y-y_))
train_step = tf.train.AdamOptimizer(0.2).minimize(loss)



with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    print("\n")
    print("w1:\n", sess.run(w1))
    print("w2:\n", sess.run(w2))
    print("w3:\n", sess.run(w3))
    STEPS = 3000
    for i in range(STEPS):
        start = (i*BATCH_SIZE)
        end = start + BATCH_SIZE
        sess.run(train_step, feed_dict = {x: X[start:end], y_: Y[start:end]})
    total_loss = sess.run(loss, feed_dict = {x:X, y_:Y})
    print("\n")
    print(total_loss)
 #   sess.run(w1).dump(r"C:\Users\wzy\Desktop\python_project\TM_data\w1.dat")
  #  sess.run(w2).dump(r"C:\Users\wzy\Desktop\python_project\TM_data\w2.dat")
   # sess.run(w3).dump(r"C:\Users\wzy\Desktop\python_project\TM_data\w3.dat")

 

你可能感兴趣的:(python,人工智能,TensorFlow,python,人工智能,矩阵预测,TensorFlow)