神经网络解决分类问题主要可以分为以下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)#成功