一、TensorFlow基本概念
1.张量(Tensor):张量是数学的一个分支学科,发展起源和历史请自行百度。在TensorFlow里,张量是矢量的扩展,张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数。例如,①3.14,标量,0维;②[1,2,3],矢量,1维数组,1阶张量;③[1,2,3;4,5,6;7,8,9],二维矩阵,2维数组,2阶张量;以此类推,张量可以扩展到n维矩阵,n阶张量。
2.计算图(Graph)
计算图生成的过程,就是模型定义的过程。计算图是静态的。
如训练模型为Y=aX+b,则其计算图为:
很容易看清,计算图就是一个静态的计算过程,其中各个节点是一个变量或一个计算,而节点之间的边描述了计算之间的依赖关系。整个过程可以看作是数据流动的过程。
这里说计算图是静态的,是因为在使用TensorFlow框架编程以进行模型训练时,模型定义即定义计算图的过程,仅仅只是定义,不做任何计算,实际计算过程通过会话(Session)完成。
当然,实际模型会比这个模型复杂很多,因此在模型很复杂的情况下,计算图就会起到梳理思路的作用,通过TensorBoard可视化工具即可查看实际模型的计算图。
3.会话(Session)
我们用python语言(当然也可以使用其他语言如java、go、c等)构建出计算图后,通过Session去执行计算任务。
例如:
pred = RNN(x, istate, weights, biases)
# 定义损失和优化方法,其中算是为softmax交叉熵,优化方法为Adam
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y)) # Softmax loss
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost) # Adam Optimizer
# 进行模型的评估,argmax是取出取值最大的那一个的标签作为输出
correct_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
# 初始化
init = tf.initialize_all_variables()
# 开始运行
with tf.Session() as sess:
sess.run(init)
step = 1
# 持续迭代
while step * batch_size < training_iters:
# 随机抽出这一次迭代训练时用的数据
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
# 对数据进行处理,使得其符合输入
batch_xs = batch_xs.reshape((batch_size, n_steps, n_input))
# 迭代
sess.run(optimizer, feed_dict={x: batch_xs, y: batch_ys,
istate: np.zeros((batch_size, 2 * n_hidden))})
# 在特定的迭代回合进行数据的输出
if step % display_step == 0:
# Calculate batch accuracy
acc = sess.run(accuracy, feed_dict={x: batch_xs, y: batch_ys,
istate: np.zeros((batch_size, 2 * n_hidden))})
# Calculate batch loss
loss = sess.run(cost, feed_dict={x: batch_xs, y: batch_ys,
istate: np.zeros((batch_size, 2 * n_hidden))})
print "Iter " + str(step * batch_size) + ", Minibatch Loss= " + "{:.6f}".format(loss) + \
", Training Accuracy= " + "{:.5f}".format(acc)
step += 1
print "Optimization Finished!"
# 载入测试集进行测试
test_len = 256
test_data = mnist.test.images[:test_len].reshape((-1, n_steps, n_input))
test_label = mnist.test.labels[:test_len]
print "Testing Accuracy:", sess.run(accuracy, feed_dict={x: test_data, y: test_label,istate: np.zeros((test_len, 2 * n_hidden))})
with tf.Session() as sess以上的部分,都是在定义计算图,一下的部分才是实际开始去执行训练任务。
二、基础知识
1.tf.Variable(initializer,name):initializer是初始化参数,name是变量名。
主要用于一些可训练变量,例如模型权重或者偏置。
声明时,必须提供初始值。
与tf.Variable相关的还有:
tf.variable_scope():提供了简单的命名空间技术避免冲突。
tf.get_variable():从同一个变量范围内获得或创建,与tf.Variable有相似的地方,也有自己独有的特点。
详细信息请参考:tf.get_variable() vs tf.Variable(),tf.name_scope() vs tf.variable_scope()
2.tf.placeholder(type,shape,name):参数分别表示数据类型、维度、名字。主要用于得到传递进来的真实样本
不必指定初始值,可在运行时通过Session.run的函数feed_dict参数指定,它仅仅作为一种占位符。
3.with语句:
with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。
详细信息请参考:浅谈 Python 的 with 语句