联系我们
- 地 址:北京市海淀区北四环西路9号 ,主 营:人脸识别,活体检测,身份证识别,银行卡识别,名片识别,车牌识别,OCR识别等及智能识别技术。
- 电 话:13146317170 廖经理
- 传 真:
- 邮 箱:398017534@qq.com
人工智能之神经网络的搭建
人工智能之神经网络的搭建
首先,神经网络的完成过程:
第一, 准备数据库,提取特征,作为输入为给神经网络(Neural Network,NN)
第二, 搭建NN构造,从输入到输出(先搭建计算图,再用会话执行)(NN前向算法--->计算输出)
第三, 大量特征数据喂给NN,迭代优化NN参数,直到模型到达请求(NN反向算法--->优化参数锻炼模型)
第四, 运用锻炼好的模型完成预测和分类
后面,我们分别来看看前向传播和反向传播的完成范式.
我们先来看看前向传播:(这一局部来自于pku教程的解说并自创了前辈的一些概述)
前向传播就是搭建模型的计算过程,让模型具有推理才能,能够针对一组输入给出相应的输出。
在研讨前向传播前,我们先得搞明白什么叫做神经网络的层数是怎样定义的,
神经网络层数=躲藏计算层+1个输出层,躲藏计算层就是运算中产生的中间参数,如下图所示。
神经网络复杂度(NN复杂度):层数+参数来表现。
为便当了解,我们举这么一个例:
消费一批零件,体积为x1,重量为x2,1、2都代表下标。体积和重量就是我们选择的特征,把它们喂入神经网络,当体积和重量这组数据走过神经网络后会得到一个输出。
假设输入的特征值是:体积0.7 重量0.5
由搭建的神经网络可得,躲藏层节点a11=x1*w11+x2*w21=0.14+0.15=0.29,同理算得节点a12=0.32,a13=0.38,最终计算得到输出层Y=-0.015,这便完成了前向传播过程。
推导:
第一层 X是输入为1X2矩阵 用x表示输入,是一个1行2列矩阵,表示一次输入一组特征,这组特征包含了 体积和重量两个元素。
W 前节点编号,后节点编号(层数) 为待优化的参数 ,它的上标代表层数
参数的产生在我的上一篇水文里面有提到。
关于第一层的w 前面有两个节点,后面有三个节点 w应该是个两行三列矩阵,
我们这样表示:
神经网络共有几层(或当前是第几层网络)都是指的计算层,输入不是计算层,所以a为第一层网络,a是一个一行三列矩阵。
我们这样表示:a(1)=[a11, a12, a13]=XW(1)
第二层参数要满足前面三个节点,后面一个节点,所以W(2) 是三行一列矩阵。 我们这样表示:
我们把每层输入乘以线上的权重w,这样用矩阵乘法能够计算出输出y了。
先算出a的运算表达:a= tf.matmul(X,W1)
在算出y的运算表达:y= tf.matmul(a, W2)
由于需求计算结果,就要用with构造完成,一切变量初始化过程、计算过程都要放到 sess.run 函数中。
关于变量初始化,我们在sess.run中写入tf.global_variables_initializer完成对一切变量初始化,也就是赋初值。关于计算图中的运算,我们直接把运算节点填入sess.run 即可,比方要计算输出y,直接写 sess.run(y) 即可。
在实践应用中,我们能够一次喂入一组或多组输入,让神经网络计算输出y,能够先用tf.placeholder给输入占位。
假如一次喂一组数据shape的第一维位置写1,第二维位置看有几个输入特征;
假如一次想喂多组数据,shape的第一维位置能够写None表示先空着,第二维位置写有几个输入特征。
这样在feed_dict中能够喂入若干组体积重量了。
代码示例:
#coding:utf-8
import tensorflow as tf
#定义输入和参数
#sess.run中喂一组数据
x = tf.placeholder(tf.float32, shape=(1, 2))
w1= tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2= tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
#定义前向传播过程
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
#用会话计算结果,计算图节点的值
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
print"y in this case is:\n",sess.run(y, feed_dict={x: [[0.7,0.5]]})
1.楼上是sess.run中喂入一组数据的状况 ,在sess.run中用feed_dict={}喂入数据:第一组喂体积0.7、重量0.5
#coding:utf-8
import tensorflow as tf
#定义输入和参数
#用placeholder定义输入(sess.run喂多组数据)
x = tf.placeholder(tf.float32, shape=(None, 2))
w1= tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2= tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
#调用会话计算结果
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
print "the result in this case is:\n",sess.run(y, feed_dict={x: [[0.7,0.5],[0.2,0.3],[0.3,0.4],[0.4,0.5]]})
print "w1:\n", sess.run(w1)
print "w2:\n", sess.run(w2)
2.楼上是输入多组数据组成的汇合的状况。
停停停停,先考虑哲学的奥义。
再看看反向传播:
其目的是为了优化模型参数,在一切参数上用梯度降落,使得NN模型在锻炼数据上的损失函数最小。损失函数的话,我会在后面的水文中更细致地解说。
损失函数:(loss):预测值(y)与已知答案(y_)的差距
均方误差MSE:MSE(y,y_)就是我们高中数学的每个样本与均值差的平方之和再除以样本容量。
Loss=tf.reduce_mean(tf.square(y_-y))
反向传播锻炼办法:以减小loss值为优化目的。
以减小loss值为优化目的,常用的优化办法(优化器)有三种:
梯度降落、momentum优化器、adam优化器。
这三种优化办法用tensorflow的函数能够表示为:
train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
train_step=tf.train.MomentumOptimizer(learning_rate, momentum).minimize(loss)
train_step=tf.train.AdamOptimizer(learning_rate).minimize(loss)
其中learning_rate表示学习率,表示参数更新的幅度,运用时,我们能够用一个表较小的值,比方0.001.
学习率:learning-rate,决议参数每次更新的幅度。
最后来看看教师最后给出的一份源代码:
#coding:utf-8
#导入模块,生成模仿数据集。numpy是python的科学计算模块
import tensorflow as tf
import numpy as np
BATCH_SIZE = 8
SEED = 23455
#基于seed产生随机数
rdm = np.random.RandomState(SEED)
#随机数返回32行2列的矩阵 表示32组 体积和重量 作为输入数据集
X = rdm.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 = tf.placeholder(tf.float32, shape=(None, 2))
y_= tf.placeholder(tf.float32, shape=(None, 1))
w1= tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2= tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
#2定义损失函数及反向传播办法。
loss_mse = tf.reduce_mean(tf.square(y-y_))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss_mse)
#train_step = tf.train.MomentumOptimizer(0.001,0.9).minimize(loss_mse)
#train_step = tf.train.AdamOptimizer(0.001).minimize(loss_mse)
#3生成会话,锻炼STEPS轮
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
# 输出目前(未经锻炼)的参数取值。
print "w1:\n", sess.run(w1)
print "w2:\n", sess.run(w2)
print "\n"
# 锻炼模型。
STEPS = 3000
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:
total_loss = sess.run(loss_mse, feed_dict={x: X, y_: Y_})
print("After %d training step(s), loss_mse on all data is %g" % (i, total_loss))
# 输出锻炼后的参数取值。
print "\n"
print "w1:\n", sess.run(w1)
print "w2:\n", sess.run(w2)
关于这份废品,有几处需求阐明:
1.numpy是python的科学计算模块
2.我们规则BATCH_SIZE为输入数据组数(or范围),一次不可喂入过多数据,否则神经网络会噎住。
3.seed是伪随机,我们只是为了演示才用把seed规则了这样一个值。
4.是应用随机数生成一个数据集,Y是一个标签:我们人为(为了演示)给出一个零件能否合格的评判规范,体积+重量<1的以为是合格的,标志为1;否则以为不合格,标志为0。我们在第十四行完成了数据标注的功用,先用for循环在表中抽取一行x0和x1,再判别x0+x1,假如小于1就是真,y=1;否则是假的,y=0。然后我们能够把数据集X,Y打印出来
5.接下来我们再定义神经网络的输入参数和输出:x是输入的特征,是三十二位浮点型的量,只晓得有两类特征(体积和重量),并不晓得有几组特征(所以写None)。Y_表示规范答案,表示合格是1不合格是0的标签,只要一个元素,非零即1.参数W要匹配输入和输出,w1是2*3,w2是3*1的矩阵,
6.前向传播过程中,a=tf.matmul(x,w1)和y=tf.matmul(a,w2)是计算过程描绘,用矩阵乘法完成。反向传播中,需求指定损失函数loss,我们用均方误差计算loss,运用梯度降落完成锻炼过程,三种优化办法择一即可。
7.能够试着修正这份范式代码,看看运转出来的结果有什么不同。
第一, 准备数据库,提取特征,作为输入为给神经网络(Neural Network,NN)
第二, 搭建NN构造,从输入到输出(先搭建计算图,再用会话执行)(NN前向算法--->计算输出)
第三, 大量特征数据喂给NN,迭代优化NN参数,直到模型到达请求(NN反向算法--->优化参数锻炼模型)
第四, 运用锻炼好的模型完成预测和分类
后面,我们分别来看看前向传播和反向传播的完成范式.
我们先来看看前向传播:(这一局部来自于pku教程的解说并自创了前辈的一些概述)
前向传播就是搭建模型的计算过程,让模型具有推理才能,能够针对一组输入给出相应的输出。
在研讨前向传播前,我们先得搞明白什么叫做神经网络的层数是怎样定义的,
神经网络层数=躲藏计算层+1个输出层,躲藏计算层就是运算中产生的中间参数,如下图所示。
神经网络复杂度(NN复杂度):层数+参数来表现。
为便当了解,我们举这么一个例:
消费一批零件,体积为x1,重量为x2,1、2都代表下标。体积和重量就是我们选择的特征,把它们喂入神经网络,当体积和重量这组数据走过神经网络后会得到一个输出。
假设输入的特征值是:体积0.7 重量0.5
由搭建的神经网络可得,躲藏层节点a11=x1*w11+x2*w21=0.14+0.15=0.29,同理算得节点a12=0.32,a13=0.38,最终计算得到输出层Y=-0.015,这便完成了前向传播过程。
推导:
第一层 X是输入为1X2矩阵 用x表示输入,是一个1行2列矩阵,表示一次输入一组特征,这组特征包含了 体积和重量两个元素。
W 前节点编号,后节点编号(层数) 为待优化的参数 ,它的上标代表层数
参数的产生在我的上一篇水文里面有提到。
关于第一层的w 前面有两个节点,后面有三个节点 w应该是个两行三列矩阵,
我们这样表示:
神经网络共有几层(或当前是第几层网络)都是指的计算层,输入不是计算层,所以a为第一层网络,a是一个一行三列矩阵。
我们这样表示:a(1)=[a11, a12, a13]=XW(1)
第二层参数要满足前面三个节点,后面一个节点,所以W(2) 是三行一列矩阵。 我们这样表示:
我们把每层输入乘以线上的权重w,这样用矩阵乘法能够计算出输出y了。
先算出a的运算表达:a= tf.matmul(X,W1)
在算出y的运算表达:y= tf.matmul(a, W2)
由于需求计算结果,就要用with构造完成,一切变量初始化过程、计算过程都要放到 sess.run 函数中。
关于变量初始化,我们在sess.run中写入tf.global_variables_initializer完成对一切变量初始化,也就是赋初值。关于计算图中的运算,我们直接把运算节点填入sess.run 即可,比方要计算输出y,直接写 sess.run(y) 即可。
在实践应用中,我们能够一次喂入一组或多组输入,让神经网络计算输出y,能够先用tf.placeholder给输入占位。
假如一次喂一组数据shape的第一维位置写1,第二维位置看有几个输入特征;
假如一次想喂多组数据,shape的第一维位置能够写None表示先空着,第二维位置写有几个输入特征。
这样在feed_dict中能够喂入若干组体积重量了。
代码示例:
#coding:utf-8
import tensorflow as tf
#定义输入和参数
#sess.run中喂一组数据
x = tf.placeholder(tf.float32, shape=(1, 2))
w1= tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2= tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
#定义前向传播过程
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
#用会话计算结果,计算图节点的值
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
print"y in this case is:\n",sess.run(y, feed_dict={x: [[0.7,0.5]]})
1.楼上是sess.run中喂入一组数据的状况 ,在sess.run中用feed_dict={}喂入数据:第一组喂体积0.7、重量0.5
#coding:utf-8
import tensorflow as tf
#定义输入和参数
#用placeholder定义输入(sess.run喂多组数据)
x = tf.placeholder(tf.float32, shape=(None, 2))
w1= tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2= tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
#调用会话计算结果
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
print "the result in this case is:\n",sess.run(y, feed_dict={x: [[0.7,0.5],[0.2,0.3],[0.3,0.4],[0.4,0.5]]})
print "w1:\n", sess.run(w1)
print "w2:\n", sess.run(w2)
2.楼上是输入多组数据组成的汇合的状况。
停停停停,先考虑哲学的奥义。
再看看反向传播:
其目的是为了优化模型参数,在一切参数上用梯度降落,使得NN模型在锻炼数据上的损失函数最小。损失函数的话,我会在后面的水文中更细致地解说。
损失函数:(loss):预测值(y)与已知答案(y_)的差距
均方误差MSE:MSE(y,y_)就是我们高中数学的每个样本与均值差的平方之和再除以样本容量。
Loss=tf.reduce_mean(tf.square(y_-y))
反向传播锻炼办法:以减小loss值为优化目的。
以减小loss值为优化目的,常用的优化办法(优化器)有三种:
梯度降落、momentum优化器、adam优化器。
这三种优化办法用tensorflow的函数能够表示为:
train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
train_step=tf.train.MomentumOptimizer(learning_rate, momentum).minimize(loss)
train_step=tf.train.AdamOptimizer(learning_rate).minimize(loss)
其中learning_rate表示学习率,表示参数更新的幅度,运用时,我们能够用一个表较小的值,比方0.001.
学习率:learning-rate,决议参数每次更新的幅度。
最后来看看教师最后给出的一份源代码:
#coding:utf-8
#导入模块,生成模仿数据集。numpy是python的科学计算模块
import tensorflow as tf
import numpy as np
BATCH_SIZE = 8
SEED = 23455
#基于seed产生随机数
rdm = np.random.RandomState(SEED)
#随机数返回32行2列的矩阵 表示32组 体积和重量 作为输入数据集
X = rdm.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 = tf.placeholder(tf.float32, shape=(None, 2))
y_= tf.placeholder(tf.float32, shape=(None, 1))
w1= tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2= tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
#2定义损失函数及反向传播办法。
loss_mse = tf.reduce_mean(tf.square(y-y_))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss_mse)
#train_step = tf.train.MomentumOptimizer(0.001,0.9).minimize(loss_mse)
#train_step = tf.train.AdamOptimizer(0.001).minimize(loss_mse)
#3生成会话,锻炼STEPS轮
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
# 输出目前(未经锻炼)的参数取值。
print "w1:\n", sess.run(w1)
print "w2:\n", sess.run(w2)
print "\n"
# 锻炼模型。
STEPS = 3000
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:
total_loss = sess.run(loss_mse, feed_dict={x: X, y_: Y_})
print("After %d training step(s), loss_mse on all data is %g" % (i, total_loss))
# 输出锻炼后的参数取值。
print "\n"
print "w1:\n", sess.run(w1)
print "w2:\n", sess.run(w2)
关于这份废品,有几处需求阐明:
1.numpy是python的科学计算模块
2.我们规则BATCH_SIZE为输入数据组数(or范围),一次不可喂入过多数据,否则神经网络会噎住。
3.seed是伪随机,我们只是为了演示才用把seed规则了这样一个值。
4.是应用随机数生成一个数据集,Y是一个标签:我们人为(为了演示)给出一个零件能否合格的评判规范,体积+重量<1的以为是合格的,标志为1;否则以为不合格,标志为0。我们在第十四行完成了数据标注的功用,先用for循环在表中抽取一行x0和x1,再判别x0+x1,假如小于1就是真,y=1;否则是假的,y=0。然后我们能够把数据集X,Y打印出来
5.接下来我们再定义神经网络的输入参数和输出:x是输入的特征,是三十二位浮点型的量,只晓得有两类特征(体积和重量),并不晓得有几组特征(所以写None)。Y_表示规范答案,表示合格是1不合格是0的标签,只要一个元素,非零即1.参数W要匹配输入和输出,w1是2*3,w2是3*1的矩阵,
6.前向传播过程中,a=tf.matmul(x,w1)和y=tf.matmul(a,w2)是计算过程描绘,用矩阵乘法完成。反向传播中,需求指定损失函数loss,我们用均方误差计算loss,运用梯度降落完成锻炼过程,三种优化办法择一即可。
7.能够试着修正这份范式代码,看看运转出来的结果有什么不同。
上一条:桌面人证比对终端
下一条:酒店前台人脸识别机器