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