Tensorflow结构简介

来源:互联网 发布:java三维地质建模 编辑:程序博客网 时间:2024/06/16 19:34

Tensorflow:
1)使用graph来表示计算任务;
2))graph中的节点是op操作,获取的数据是Tensor,输出的数据也是Tensor,使用Tensor表示在op节点间流动的数据,可以讲一组小图像表示为一个四维浮点数组,这四个维度分别是[batch,height,width,channel];
3)通过session执行graph,即session启动graph,session将graph的op分配到设备上面,同时提供执行op的方法,方法执行完毕后,将产生的tensor返回。python语言中,返回的tensor是numpy ndarray对象,C或者C++语言中,返回的是tensorflow::Tensor实例。

Tensorflow程序通常分为两个阶段,图的构造以及图的执行阶段,其中:
1)图的构造阶段表示用Tensor表示数据,同时针对数据的操作创建op节点,即针对数据的操作调用tensorflow中的相应的库函数执行相应的操作,图的创建阶段完成;
2)图的执行阶段即创建session对话,然后在session会话中执行相应的op操作。

Tensor:tensor数据结构表示所有的数据,在graph的op节点间传递的所有数据都是tensor,一个tensor包括一个rank和shape,具体参考:
http://wiki.jikexueyuan.com/project/tensorflow-zh/resources/dims_types.html
feed操作:
Tensorflow提供了feed机制,临时替代图中任意操作的tensor,可以对图中的任何操作提供不定,直接插入一个tensor,常用的使用方式是使用tf.placeholder()占位符,等到运行时候填充进入即可。

Tensorflow对mnist数据集进行运算主要包括三个步骤:

  1. 创建模型:

    mnist中我们每张图片的大小为[28,28],我们将其用一维向量表达,即为一个784维度的向量,因为我们有非常多的图片,因此我们用二维向量来表示图片,第一维表示输入图片的个数,第二维表示输入图片的大小,mnist中都为784,即**y=softmax(Wx+b);**其中softmax函数可以看做一个激励函数或者链接函数,讲我们定义的线性函数的输出转换到我们想要的格式。x=tf.placeholder(tf.float32,[None,784]);//二维浮点数张量W=tf.Variable(tf.zeros([784,10]))//二维可修改张量b=tf.Variable(tf.zeros([10])y=tf.nn.softmax(tf.matmul(W,x)+b)

    其中y是我们预测的概率分布,

  2. 训练模型:

    我们拥有一个评估模型的指标,被称为成本或者损失,训练过程中我们尽量最小化这个指标即可。
    通常我们选用“交叉熵”作为成本函数,交叉熵的定义如下:
    cross_entropy=-∑y_log(y),这里y_表示我们实际的概率分布,y表示预测的概率分布,tensorflow表示如下:
    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)//op操作,输入为张量,输出为张量
    init=tf.initialize_all_variables();
    创建了图后,我们需要在session中启动这个图:
    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})
    //表示我们让模型循环1000次,每次随机抓取训练数据中的100个批处理数据点,然后利用这些数据点作为参数来替换掉之前的占位符来运行train_step.

  3. 评估模型:

    tf.argmax函数可以给出某个tensor对象在某一维度上的数据最大值所在的索引,由于标签向量是0,1组成,因此我们可以调用该函数获得类别标签,correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1)),这行带啊可以获得一组布尔值,为了更好的表示,我们将其用浮点数进行表示,即accuracy=tf.reduce_mean(tf.cast(correct_prediction,"float"))print sess.run(accuray,feed_dict={x:mnist_test.images,y_mnist.test.labels})

参考资料:http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html