TensorFlow
TensorFlow 是一种采用数据流图(data flow graphs),用于数值计算的开源软件库。在 Tensorflow 中,所有不同的变量和运算都是储存在计算图,所以在我们构建完模型所需要的图之后,还需要打开一个会话(Session)来运行整个计算图
通常使用import tensorflow as tf来载入TensorFlow
在TensorFlow程序中,系统会自动维护一个默认的计算图,通过tf.get_default_graph函数可以获取当前默认的计算图。除了使用默认的计算图,可以使用tf.Graph函数来生成新的计算图,不同计算图上的张量和运算不会共享
在TensorFlow程序中,所有数据都通过张量的形式表示,张量可以简单的理解为多维数组,而张量在TensorFlow中的实现并不是直接采用数组的形式,它只是对TensorFlow中运算结果的引用。即在张量中没有真正保存数字,而是如何得到这些数字的计算过程
如果对变量进行赋值的时候不指定类型,TensorFlow会给出默认的类型,同时在进行运算的时候,不会进行自动类型转换
会话(session)拥有并管理TensorFlow程序运行时的所有资源,所有计算完成之后需要关闭会话来帮助系统回收资源,否则可能会出现资源泄漏问题
一个简单的计算过程:
import tensorflow as  tf a = tf.constant([1, 2], name='a') b = tf.constant([3, 4], name='b') c = a + b with tf.Session() as sess:     print(sess.run(c))可以通过ConfigProto Protocol Buffer来配置需要生成的会话:
config = tf.ConfigProto(allow_soft_placement=True, log_device_placement=True) sess1 = tf.InteractiveSession(config=config) sess2 = tf.Session(config=config)通过ConfigProto可以配置类似并行的线程数、GPU分配策略、运算超时时间等参数。当allow_soft_placement设置为True时,当出现以下情况,GPU上的运算可以放到CPU上进行:
- 运算无法在GPU上执行
 - 没有GPU资源
 - 运算输入包含对CPU计算结果的引用
 
当log_device_placement设置为True时,日志中将会记录每个节点被安排在哪个设备上以方便调试
使用神经网络解决分类问题主要分为以下4个步骤:
- 提取问题中实体的特征向量作为神经网络的输入
 - 定义神经网络的结构,并定义如何从神经网络的输入得到输出
 - 通过训练数据来调整神经网络中参数的取值
 - 使用训练好的神经网络来预测未知的数据
 
TensorFlow中矩阵乘法的使用:
tf.matmul(x, w)tf.random_normal函数可以产生一个矩阵,矩阵中的元素是均值为0,标准差为指定数的随机数,TensorFlow中,一个变量在被初始化之前,该变量的初始化过程需要被明确地调用:
a = tf.Variable(tf.random_normal([2, 3], stddev=2)) b = tf.Variable(tf.random_normal([2, 3], stddev=2)) c = tf.matmul(a, b) with tf.Session() as sess:     sess.run(a.initializer)     sess.run(b.initializer)     print(sess.run(c))一个简化初始化过程的函数,可以实现初始化所有变量的过程:
init_op = tf.global_variables_initializer() sess.run(init_op)通过tf.global_variables()函数可以拿到当前计算图上的所有变量,有助于持久化整个计算图的运行状态
TensorFlow中,变量的类型是不可改变的,而纬度是可以更改的,只是需要设置validate_shape=False
TensorFlow提供了placeholder机制用于提供输入数据。placeholder相当于定义了一个位置,这个位置中的数据在程序运行时再指定。这样在程序中就不需要生成大量常量来提供输入数据,而只需要将数据通过placeholder传入TensorFlow计算图。在placeholder定义时,这个位置的数据类型需要指定,纬度信息可以推导出来,所以不一定要给出
a = tf.Variable(tf.random_normal([2, 3], stddev=2)) x = tf.placeholder(tf.float32, shape=(1, 2), name='input') v1 = tf.matmul(x, a) with tf.Session() as sess:     sess.run(a.initializer)     print(sess.run(v1, feed_dict={x : [[6, 7]]}))在shape的一个纬度上使用None可以方便使用不同的batch大小shape(None, 3)
假定损失函数为loss = (...),一次训练过程为sess.run(loss, feed_dict{x: X, ...})
