(三)TensorFlow实现神经网络

来源:互联网 发布:php 反射api 编辑:程序博客网 时间:2024/06/05 00:57



           神经网络解决分类问题主要可以分为以下4个步骤:

          1、提取问题中实体的特征向量作为神经网络的输入。

          2、定义神经网络的结构,并定义如何从神经网络的输入得到输出。这个过程就是神经网络的前向传播算法。

          3、通过训练 数据来调整神经网络中参数的取值。

          4、使用训练好的神经网络来预测未知的数据。


          前向传播矩阵相乘过程代码:

          a = tf.matmul(x,w1)

         y = tf.matmul(a,w2)

         如若x为n*1的向量,a为m*1的向量,y为一个数,那么 w1为m*n的数组,w2为1*m的数组。

    

        tensorflow中,变量(tf.Variable)的作用就是保存和更新神经网络中的参数。使用随机数给Tensorflow中的变量初始化。

  下面一段代码给出了一种在TensorFlow中声明一个2*3的矩阵变量的方法:

        weights = tf.Variable(tf.random_normal([2,3],atddev = 2))

 tf.Variable为TensorFlow变量的声明函数,该函数中给出了初始化这个变量的方法,初始值可设置为随机数、常数或者是通过其他变量的初始值计算得到。函数中会产生一个2*3的矩阵,矩阵中的元素是均值为0,标准差为2的随机数。tf.random_normal函数可以通过参数mean来指定平均值,在没有指定时默认为0.通过满足正太分布的随机数来初始化神经网络中的参数。其他随机数生成器包括:tf.random_normal、tf.truncated_normal、tf.random_uniform、tf.random_gamma。通过常数来初始化变量:tf.zeros,tf.ones,tf.fill,tf.constant.


偏置项使用常数来设置初始值:biases = tf.Variable(tf.zeros([3]))  将生成一个初始值为0,长度为3的变量。除了使用随机数或者常数,也支持通过其他变量的初始值来初始化新的变量。

     w2 = tf.Variable(weights.initialized_value())

    w3 = tf.Variable(weights.initialized_value()*2)


以下样例通过变量实现神经网络的参数并实现前向传播的过程

import tensorflow as tf

#声明w1,w2两个变量。这里seed参数为设定随机种子,这样可以保证每次运行结果一样

#

w1 = tf.Variable(tf.random_normal([2,3],stddev = 1,seed = 1))

w2 = tf.Variable(tf.random_normal([2,3],stddev = 1,seed = 1))


#暂时将输入的特征向量定义为一个常量。x为一个1*2的矩阵

x = tf.constant([0.7,0.9])

#此处x的定义还可以利用placeholder作为存放输入数据的地方,维度不一定要定义,但给出维度可降低出错率

x = tf.placeholder(tf.float32,shape(1,2),name = "input")


#前向传播算法获得神经网络的输出

a = tf.matmul(x,w1)

y = tf.matmul(a,w2)

#以上定义了计算图中所有的计算,但这些被定义的计算在这一步中并不真正的运行,以下通过声明一个会话,计算结果



sess = tf.Session()

#此处不可直接通过sess.run(y)来获取y的取值,因为w1和w2都没有初始化

sess.run(w1.initializer)  #初始化w1

sess.run(w2.initializer)  #初始化w2

#输出[[]]

#上面两句初始化可以改为

init_op = tf.initialize_all_variable()

sess.run(init_op)


print(sess.run(y))

#对于利用placeholder定义的x上一句会出错,应写为:

print(sess.run(y,feed_dice={x:[[0.7,0.9]]}))

sess.close()


以下提供了一种更加便捷的方式来完成变量初始化过程。

下面通过tf.initialize_all_variables函数一次性初始化所有变量,便捷了单个调用的麻烦

init_op = tf.initialize_all_variables()#该函数可以自动处理变量之间的依赖关系

sess.run(init_op)


以上所提到的变量都是一种特殊的张量。

###################################################################################################


上表为TensorFlow中维护的集合列表,所有变量都会被自动的加入GraphKeys.VARIABLES这个集合。tf.all_variables函数可以拿到当前计算图中所有的变量。可以通过变量声明函数中的trainable参数来区分需要优化的参数(一般为神经网络中的参数)和其他参数(如迭代的轮数)。如果声明变量时参数trainable为True,那么这个变量将会被加入GraphKeys.TRAINABLE_VARIABLES。可以通过tf.trainable_variables函数得到所有需要优化的参数。TensorFlow中提供的神经网络优化算法会将GraphKeys.TRAINABLE_VARIABLES集合中的变量作为默认的优化对象。


维度和类型是变量最重要的两个属性。类型是不可改变的,维度在程序中式可能改变的,但需要设置参数validate_shape = False。

如下

w1 = tf.Variable(tf.random_normal([2,3],stddev = 1),name = "w1")

w2 = tf.Variable(tf.random_normal([2,3],stddev=1),name = "w1")

tf.assign(w1,w2)#出错,维度不匹配

tf.assign(w1,w2,validata_shape = False)#成功