Tensorflow—基本用法
- 使用图 (graph) 来表示计算任务.
- 在被称之为 会话 (Session) 的上下文 (context) 中执行图.
- 使用 tensor 表示数据.
- 通过 变量 (Variable) 维护状态.
- 使用 feed 和 fetch 可以为任意的操作(arbitrary operation)赋值或者从其中获取数据。
• TensorFlow 是一个编程系统, 使用图来表示计算任务. 图中的节点被称之为 op (operation 的 缩写)。一个 op 获得 0 个或多个 Tensor。执行计算, 产生 0 个或多个 Tensor。
• 每个 Tensor 是一个类型化的多维数组。例如,你可以将一小组图像集表示为一个四维浮点数 数组, 这四个维度分别是 [batch, height, width, channels].
• 一个 TensorFlow 图描述了计算的过程. 为了进行计算, 图必须在 会话 里被启动.
• 会话 将图的 op 分发到诸如 CPU 或 GPU 之类的 设备 上, 同时提供执行 op 的方法.
• 这些方法执行后, 将产生的 tensor 返回. 在 Python 语言中, 返回的 tensor 是numpy ndarray 对象。
Tensorflow—构建图
- 创建源op:源op不需要任何输入。例如常量(constant)。源op的输出被传递给其他op做 运算。
- 在会话(session)中启动图
- 关闭session以释放资源
Tensorflow—元素
Variables
变量Variables维护图执行过程中的状态信息. 通常会将一个统计模型中的参数表示为一组变量. 例如, 你可以将一个神经网络的权重作为某个变量存储在一个 tensor 中. 在训练过程中, 通过重复运行训 练图, 更新这个 tensor.
Fetch:
为了取回操作的输出内容,可以使用session对象的run()调用执行图时,传入一些tensor,这些 tensor会帮助你取回结果。
Feed:
使用一个tensor值临时替换一个操作的输出结果。可以提供feed数据作为run()调用的参数. feed 只在调用它的方法内有效, 方法结束, feed 就会消失. 最常见的用例是将某些特殊的操作指定为 “feed” 操作, 标记的方法是使用 tf.placeholder() 为这些操作创建占位符。
placeholder
placeholder是一个数据初始化的容器,它与变量最大的不同在于placeholder定义的是一个模板,这 样我们就可以在session运行阶段,利用feed_dict的字典结构给placeholder填充具体的内容,而无需 每次都提前定义好变量的值,大大提高了代码的利用率。
代码实现:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt#使用numpy生成200个随机点
x_data=np.linspace(-0.5,0.5,200)[:,np.newaxis]
noise=np.random.normal(0,0.02,x_data.shape)
y_data=np.square(x_data)+noise#定义两个placeholder存放输入数据
x=tf.placeholder(tf.float32,[None,1])
y=tf.placeholder(tf.float32,[None,1])#定义神经网络中间层
Weights_L1=tf.Variable(tf.random_normal([1,10]))
biases_L1=tf.Variable(tf.zeros([1,10])) #加入偏置项
Wx_plus_b_L1=tf.matmul(x,Weights_L1)+biases_L1
L1=tf.nn.tanh(Wx_plus_b_L1) #加入激活函数#定义神经网络输出层
Weights_L2=tf.Variable(tf.random_normal([10,1]))
biases_L2=tf.Variable(tf.zeros([1,1])) #加入偏置项
Wx_plus_b_L2=tf.matmul(L1,Weights_L2)+biases_L2
prediction=tf.nn.tanh(Wx_plus_b_L2) #加入激活函数#定义损失函数(均方差函数)
loss=tf.reduce_mean(tf.square(y-prediction))
#定义反向传播算法(使用梯度下降算法训练)
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)with tf.Session() as sess:#变量初始化sess.run(tf.global_variables_initializer())#训练2000次for i in range(2000):sess.run(train_step,feed_dict={x:x_data,y:y_data})#获得预测值prediction_value=sess.run(prediction,feed_dict={x:x_data})#画图plt.figure()plt.scatter(x_data,y_data) #散点是真实值plt.plot(x_data,prediction_value,'r-',lw=5) #曲线是预测值plt.show()