将以更总结性质的方式来做tensorflow笔记,作为理解神经网络的途径。
不是做字典,也不是摘抄。
为了识别代码括号内是空还是有数值,如果不作说明,我会在可以填写内容的括号内填写案例。
张量的创建
- 常量:
tf.constant([[2.0],[1.0]])
- 变量:
tf.Variable()
一般对于参数,需要先随机生成这些参数来进行初始化。往往在tf.Variable中加入生成方式。有tf.random_normal([1,2],stddev=1,mean=0,seed=1)
,tf.fill
等方式。 - 占位:
tf.placeholder(tf.float32,shape=(1,2))
相当于创建一个给定大小的空矩阵,在输入数据数量不确定时,可以用None来空出形状,比如tf.placeholder(tf.float32,shape=(None,2))
前向传播
传播需要用到矩阵相乘的命令,为tf.matmul(A,B)
,很好理解,即为Matrix Multiply的缩写。注意,相乘的两个张量是没有经过转置的。不像是 而是 值得一提的是,对于输入和权重张量来说,输入表示有组数据,每个数据有个分量。而对于权重矩阵,下标分别为该层神经网络的神经元数和下一层神经网络的神经元数。
所以,假设有一个的神经网络,第一个为数据的维数,第二为隐藏层的神经元,第三个为输出层。则易知输入数据的shape为(1,2),输入层到第一隐藏层的权重矩阵为(2,3),第一隐藏层到输出层的权重矩阵为(3,1),传播过程如下:
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
会话
首先这是tensorflow库下的一个字库,为tf.Session()
,在创建会话时为了一种简洁性,往往使用with as语句来创建一个临时的调用窗口,即with tf.Session() as sess:
- 在Session子库下,可调用函数run来获得指定的值,即
sess.run(y)
- 在计算结果之前,需要对变量进行初始化,依然是基于
run()
函数,在里面添加tf.global_variable_initializer
,实现对变量的初赋值。一般我们会给所有待优化的初始化函数赋值给一个变量,如
init_op=tf.global_variable_initializer()
sess.run(init_op)
- 在计算需要的结果时,如果没有定义输入数据集,则要通过feed_dict函数来喂数据。在run中进行,代码为
sess.run(y,feed_dict={x:[1.0,2.0]})
对喂入的数据数量没有要求,可以喂多组数据,在没有反向传播时,获得多个输出值。
反向传播
反向传播是根据目标函数来对参数进行调整。
- 一般目标是使得损失函数最小,损失函数根据具体问题来定义,代码示例
loss=tf.reduce_mean(tf.square(y_-y))
- 有了损失函数之后,需要训练方法,也就是调整的逻辑。有梯度下降、momentum优化器、adam优化器等优化方法;代码示例为
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
需要设定训练方法、训练率、优化目标三个主要内容。
网友评论