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

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 tf
import 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+noise

xinput=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.677444
100 0.0143473
200 0.00962066
300 0.00764506
400 0.00705128
500 0.00662149
600 0.00627416
700 0.0060219
800 0.00582681
900 0.0056718
1000 0.00550621
1100 0.00535482
1200 0.00519198
1300 0.00505371
1400 0.00495356
1500 0.00484783
1600 0.00474655
1700 0.00465795
1800 0.00459027
1900 0.00454197

您的赞助将是我不断创作的最大动力,谢谢支持!!!
如果您觉得我的文章对您有帮助,可以通过以下方式进行赞赏:
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值