模型
编写三部曲:tensor,operator,session
使用图 (graph) 来表示计算任务,图中的节点被称为op,一个op获得0个或多个Tensor,每个Tensor是一个类型化的多维数组,使用 tensor 表示数据。
在会话 (Session) 的上下文 (context) 中执行图.
通过 变量 (Variable) 维护状态。
使用 feed 和 fetch 可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据.
第一步:构建图
构建图的第一步,是创建源op,一个op获得0个或多个Tensor,
第二步:启动Session,用Session来执行图。
在MNIST训练数据集中,mnist.train.images 是一个形状为 [60000, 784] 的张量,第一个维度数字用来索引图片,第二个维度数字用来索引每张图片中的像素点。
标签0将表示成([1,0,0,0,0,0,0,0,0,0,0])。因此, mnist.train.labels 是一个 [60000, 10] 的数字矩阵。
实现回归模型,如下:
import tensorflow as tf
x = tf.placeholder("float",[None, 784])#None表示此张量的第一个维度可以是任何长度的,输入任意数量的MNIST图像
W = tf.Variable(tf.zeros([784,10]))# 一个Variable代表一个可修改的张量,用0来初始化W,b初值
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x,W) + b)#实现模型,x*W+b
训练模型,利用交叉熵作为损失函数,如下
y_ = tf.placeholder("float", [None,10])
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
评估模型
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
print sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})
tensor
它相当于N维的array或者list,某个定义好的tensor的数据类型是不变的,但是维数可以动态改变。
- 1阶张量:向量
- 2阶张量:二阶方阵
声明方法
- tf.name_scope + tf.Variable
- tf.variable_scope + tf.get_variable
- 共享变量
Session
- tf.Session.run(fetches, feed_dict)
fetches
取回tensor的输出
nput1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
intermed = tf.add(input2, input3)
mul = tf.mul(input1, intermed)
with tf.Session() as sess:
result = sess.run([mul, intermed])
print result
# 输出结果:
# [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]
feed_dict
给Session输入数据,tf.placeholder(dtype, shape=None, name=None)
Inserts a placeholder for a tensor that will be always fed.
TF provides a placeholder operation that must be fed with data on execution.
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.mul(input1, input2)
with tf.Session() as sess:
print sess.run([output], feed_dict={input1:[7.], input2:[2.]})
# 输出:
# [array([ 14.], dtype=float32)]
语言模型
ptb_word_lm.py导入的rnn_cell.py位于./usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/rnn_cell.py,打印变量输出i = tf.Print(i,[i],'this is i',summarize=256)
读取模型
from tensorflow.python.tools import inspect_checkpoint
model_checkpoint_path=os.path.join(model_store_path,'checkpoints/model-159000')
inspect_checkpoint.print_tensors_in_checkpoint_file(model_checkpoint_path,"",False)
tf-interactivesession
The only difference with a regular Session is that an InteractiveSession installs itself as the default session on construction. The methods Tensor.eval() and Operation.run() will use that session to run ops.
不需要显式使用session,可以直接调用run() or eval()来执行。