tensorflow入门之实现单隐层的神经网络

来源:互联网 发布:速冻饺子 知乎 编辑:程序博客网 时间:2024/06/10 16:13

tensorflow提供了大量的矩阵运算函数,可以利用这些函数和tensorflow自身的机制实现神经网络,这里我们实现了一个单隐层的神经网络。

1.首先定义用于训练神经网络的训练数据集

xdata=np.linspace(-1,1,300)[:,np.newaxis]noise=np.random.normal(0,0.05,xdata.shape)ydata=np.square(xdata)-0.5+noise

这里定义了300个范围在-1到1之间的等差数列数据xdata,以及xdata平方后加上偏置-0.5和噪声的ydata,这是训练神经网络用的原始数据集。

2.定义一个神经网络结构

神经网络结构的定义可以分层实现,分别定义各层,然后再组合起来,下面是一个定义神经网络层的函数:

def addlayer(inputdata,input_size,out_size,active=None):    weights=tf.Variable(tf.random_normal([input_size,out_size]))    bias=tf.Variable(tf.zeros([1,out_size])+0.1)    wx_plus_b=tf.matmul(inputdata,weights)+bias    if active==None:        return wx_plus_b    else:        return active(wx_plus_b)

这里weights表示神经网络中前一层与本层之间全连接的权值,将前一层的输出节点作为该层的输入,那么前一层每一个输出节点同该层所有节点构成的权值矩阵就是一个input_szie×out_size的矩阵,因此该层权值链接的大小为input_size×out_size。所以用:
weights=tf.Variable(tf.random_normal([input_size,out_size]))构造了一个有input_size×out_size个初始值符合标准正态分布的权值的权值矩阵。
同理,因为该层有多少个神经元就有多少个相应的输出,就会有多少个相应的偏置值,所以用:
bias=tf.Variable(tf.zeros([1,out_size])+0.1)定义了初始值为0.1的out_size个偏置值。
在定义好了权重和偏置之后,用:
wx_plus_b=tf.matmul(inputdata,weights)+bias进行了神经元的接受多输入和偏置刺激的运算。
最后判断如果设置了激励函数,则最后的返回结果为激励后的结果,否则,直接返回没有激励的结果。
if active==None:
return wx_plus_b
else:
return active(wx_plus_b)

在定义了添加神经网络层的操作之后,就可以定义一个完整的神经网络了,但在定义完整的神经网络之前,我们需要定义神经网络的输入,因为,在实际运行这个神经网络的时候,会依据神经网络的输入得到相应的预测结果,然后再根据这个预测结果做后续的参数优化。所以,我们先定义用于输入和保存训练集中标签的变量,这个步骤通常使用placeholder,因为它可以不断的从原始训练数据集中取数据进行训练。

xinput=tf.placeholder(tf.float32,[None,1])youtput=tf.placeholder(tf.float32,[None,1])

xinputdata用于定义神经网络的输入
youtput用于保存训练数据集中的标签数据

然后,我们可以定义一个单输入,单输出,具有单隐层(节点个数为10)的神经的3层神经网络(含输入层):

#构建一个含有单隐层的神经网络layer1=addlayer(xinput,1,10,tf.nn.relu)output=addlayer(layer1,10,1,active=None)#构建一个含有单隐层的神经网络,输出没有激励函数

3.定义神经网络的损失函数

定义损失函数是神经网络能否训练成功的关键,这里,我们用每一次小样本训练的真实数据的正确输出(也称标签)来减去神经网络的的预测结果输出的平方和的均值作为损失函数。

loss=tf.reduce_mean(tf.reduce_sum(tf.square(youtput-output),reduction_indices=[1]))

4.定义训练目标

这一步是神经网络实现中至关重要的环节,关系到训练的成败,在实现过程中,通常用tensorflow中自带的梯度下降的方法来最小化损失函数loss的方法来作为训练目标。

train=tf.train.GradientDescentOptimizer(0.05).minimize(loss)

5.对变量等进行初始化工作

这一点是很容易忘记的,但也是至关重要的,在进行正式的运行之前,必须对你之前所定义的所有变量进行初始化工作,否则就不能成功运行。

init=tf.initialize_all_variables()

6.进行神经网络的训练

这是训练神经网络的最后一步,用session激活相应的操作,然后设定训练的次数,就可以开始训练了,通常在训练过程中会实时打印一些训练参数相关的结果数据,以便观察训练的过程。

with tf.Session() as sess:    sess.run(init)  #进行初始化变量    for i in range(2000):        sess.run(train,feed_dict={xinput:xdata,youtput:ydata})        if i%100==0:            print(i,sess.run(loss,feed_dict={xinput:xdata,youtput:ydata}))

总结一下:

利用神经网络进行训练的整个过程如下:
1.导入训练数据集
2.定义神经网络结构
3.定义损失函数
4.定义训练目标
5.对变量的初始化工作
6.设定训练次数,进行相应训练,得出结果

完整实现代码如下:

# -*- coding: utf-8 -*-"""Created on Mon Apr  3 12:17:25 2017@author: zhangshaoxing"""import tensorflow as tfimport numpy as np#建立训练用的数据xdata=np.linspace(-1,1,300)[:,np.newaxis]noise=np.random.normal(0,0.05,xdata.shape)ydata=np.square(xdata)-0.5+noisexinput=tf.placeholder(tf.float32,[None,1])youtput=tf.placeholder(tf.float32,[None,1])#建立训练用的数据def addlayer(inputdata,input_size,out_size,active=None):    weights=tf.Variable(tf.random_normal([input_size,out_size]))    bias=tf.Variable(tf.zeros([1,out_size])+0.1)    wx_plus_b=tf.matmul(inputdata,weights)+bias    if active==None:        return wx_plus_b    else:        return active(wx_plus_b)#构建一个含有单隐层的神经网络layer1=addlayer(xinput,1,10,tf.nn.relu)output=addlayer(layer1,10,1,active=None)#构建一个含有单隐层的神经网络#定义损失函数和训练含义loss=tf.reduce_mean(tf.reduce_sum(tf.square(youtput-output),reduction_indices=[1]))train=tf.train.GradientDescentOptimizer(0.05).minimize(loss)#定义损失函数和训练含义#定义变量初始化操作init=tf.initialize_all_variables()#定义变量初始化操作with tf.Session() as sess:    sess.run(init)  #进行初始化变量    for i in range(2000):        sess.run(train,feed_dict={xinput:xdata,youtput:ydata})        if i%100==0:            print(i,sess.run(loss,feed_dict={xinput:xdata,youtput:ydata}))

训练结果:

0 0.677444100 0.0143473200 0.00962066300 0.00764506400 0.00705128500 0.00662149600 0.00627416700 0.0060219800 0.00582681900 0.00567181000 0.005506211100 0.005354821200 0.005191981300 0.005053711400 0.004953561500 0.004847831600 0.004746551700 0.004657951800 0.004590271900 0.00454197
0 0
原创粉丝点击