1.1神经网络:人工神经网络(Artificial Neural Network,即ANN )简称神经网络,是一种运算模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。网络的输出则依网络的连接方式,权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。
1.2前向传播:搭建模型,根据一组输入给定相应的输出,使模型具有推理的能力。
举例:生产一批零件将提交x1和重量x2作为特征输入神经网络,在隐藏层中经过加权w计算,得到输出结果y.
1.3反向传播:训练模型参数,在所有参数上使用梯度下降,使神经网络在训练数据上的损失函数最小。
1.4损失函数(loss):预测值(y)与已知答案(y_)标签的差距。
1.5学习率:决定参数每次更新的幅度
2.1.准备数据集,提取特征,作为输入喂给神经网络(Neural Network,NN)
2.2.搭建NN结构,从输入到输出,(先搭建计算图,在用会话执行) NN前向传播算法 -----> 计算输出
2.3.大量特征数据喂给NN,迭代优化NN参数 NN反向传播算法 -----> 优化参数训练模型
2.4.使用训练好的模型预测和训练
#完整神经网络
import tensorflow as tf #导入tensorflow模块
import numpy as np #导入numpy模块
BATCH_SIZE = 8 #表示一次喂入神经网络多少组数据
seed = 23455 #每次都输出一样的随机数
#基于seed产生随机数
rng = np.random.RandomState(seed)
#随机数返回32行2列的矩阵,表示32组 数据作为输入
X = rng.rand(32,2)
#从X这个32行2列的矩阵中取出一行 判断如果小于1 给Y赋值1,如果不小于1 给Y赋值0
#作为数据数据集的标签(正确答案),数据标注
Y = [[int(x0 + x1 < 1)] for (x0,x1) in X]
print('X:\n',X)
print('Y:\n',Y)
#1.定义神经网络的输入、参数和输出,这里输入两个特征x,输出一个标签y_
x = tf.placeholder(tf.float32,shape=(None,2)) #利用占位符placeholder,输入float32的 一行两列的张量表示 输入n组特征
y_ = tf.placeholder(tf.float32,shape=(None,1)) #利用占位符placeholder,输入float32的 一行两列的张量表示 输入n组标签
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1)) #第一层网络,两行三列的正态分布随机数组成的矩阵,标准差为1,随机种子为1
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1)) #第一层网络,三行一列的正态分布随机数组成的矩阵,标准差为1,随机种子为1
#2.定义前向传播过程
a = tf.matmul(x,w1) #x经过第一层网络,矩阵加权乘法
y = tf.matmul(a,w2) #经过第二层网络,矩阵加权乘法,也就是最后一层的输出结果
#3.定义损失函数及反向出传播方法
loss = tf.reduce_mean(tf.square(y-y_))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss) #梯度下降优化器
#4.生成会话,训练STEPS轮
sess = tf.Session()
init_op = tf.global_variables_initializer()
sess.run(init_op)
#输出目前未经训练的参数取值
#print('w1:',sess.run(w1))
#print('w2:',sess.run(w2))
#训练模型
STEPS = 5000 #训练5000轮
for i in range(STEPS):
start = (i*BATCH_SIZE) % 32
end = start + BATCH_SIZE
sess.run(train_step,feed_dict={x: X[start:end],y_: Y[start:end]}) #从初始数据集和标签中取出对应的数据,喂入神经网路
if i % 500 == 0: #每500轮打印一次loss值
total_loss = sess.run(loss,feed_dict={x:X,y_:Y})
print('经过%d轮训练,loss所有取值为:%g'%(i,total_loss))
#输出训练后的参数取值
print('输出训练后的参数取值:')
print('w1:\n',sess.run(w1))
print('w2:\n',sess.run(w2))
输出:
经过0轮训练,loss所有取值为:5.13118
经过500轮训练,loss所有取值为:0.429111
经过1000轮训练,loss所有取值为:0.409789
经过1500轮训练,loss所有取值为:0.399923
经过2000轮训练,loss所有取值为:0.394146
经过2500轮训练,loss所有取值为:0.390597
经过3000轮训练,loss所有取值为:0.388336
经过3500轮训练,loss所有取值为:0.386855
经过4000轮训练,loss所有取值为:0.385863
经过4500轮训练,loss所有取值为:0.385187
输出训练后的参数取值:
w1:
[[-0.69597054 0.85992473 0.09337731]
[-2.3418374 -0.12466972 0.5866561 ]]
w2:
[[-0.07531643]
[ 0.8627887 ]
[-0.05937824]]
本次神经网络一共训练5000轮,每一次训练都进行优化,最后输出训练后的参数w1和w2的值。
神经网络的实现过程(八股):准备、前传、反传、迭代
准备:
import 相关模块
定义常量
生成数据集
前向传播
定义输入
x =
y_ =
定义(网络层)参数:
w1 =
w2 =
定义网络推理计算过程
a =
y =
反向传播
定义损失函数
loss =
反向传播方法
train_step =
生成会话,训练STEPS轮,迭代
sess = tf.Session()
init_op = tf.global_variables_initializer()
sess.run(init_op)
#训练模型
STEPS = 5000 #训练5000轮
for i in range(STEPS):
start =
end =
sess.run(train_step,feed_dict)