TensorFlow初探(撞得满头大包)

1.Tensorflow简介

2.基于TensorFlow的逻辑回归

3.心得体会


1.简介

  TensorFlow是一个编程系统, 使用图来表示计算任务. 图中的节点被称之为 op (operation 的缩写). 一个 op 获得 0 个或多个 Tensor, 执行计算,产生 0 个或多个 Tensor. 每个 Tensor 是一个类型化的多维数组. 例如, 你可以将一小组图像集表示为一个四维浮点数数组, 这四个维度分别是 [batch, height, width, channels]. 一个 TensorFlow 图描述了计算的过程. 为了进行计算, 图必须在会话 里被启动.会话 将图的 op 分发到诸如 CPU 或 GPU 之类的 设备 上, 同时提供执行 op 的方法.这些方法执行后, 将产生的 tensor 返回. 在 Python 语言中, 返回的 tensor 是numpyndarray 对象; 在 C 和C++ 语言中, 返回的 tensor 是 tensorflow::Tensor 实例.

  计算图:TensorFlow程序通常被组织成一个构建阶段和一个执行阶段. 在构建阶段, op 的执行步骤被描述成一个图. 在执行阶段, 使用会话执行执行图中的 op.

  构建图:构建图的第一步, 是创建源 op(source op). 源 op 不需要任何输入, 例如常量 (Constant). 源 op 的输出被传递给其它 op 做运算.  Python 库中, op 构造器的返回值代表被构造出的 op 的输出, 这些返回值可以传递给其它op 构造器作为输入.  TensorFlow Python 库有一个默认图(default graph), op 构造器可以为其增加节点. 这个默认图对许多程序来说已经足够用了. 阅读 Graph 类文档来了解如何管理多个图.

import tensorflow as tf

 

# 创建一个常量 op, 产生一个 1x2 矩阵. 这个 op 被作为一个节点

# 加到默认图中.

#

# 构造器的返回值代表该常量 op 的返回值.

matrix1 = tf.constant([[3., 3.]])

 

# 创建另外一个常量 op, 产生一个 2x1 矩阵.

matrix2 = tf.constant([[2.],[2.]])

 

# 创建一个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输入.

# 返回值 'product' 代表矩阵乘法的结果.

product = tf.matmul(matrix1, matrix2)

 

默认图现在有三个节点, 两个 constant() op, 和一个matmul() op. 为了真正进行矩阵相乘运算, 并得到矩阵乘法的结果, 你必须在会话里启动这个图.

 

  在会话中启动图:构造阶段完成后, 才能启动图. 启动图的第一步是创建一个 Session 对象, 如果无任何创建参数, 会话构造器将启动默认图.

 tensor:TensorFlow 程序使用 tensor 数据结构来代表所有的数据, 计算图中, 操作间传递的数据都是 tensor.你可以把 TensorFlow tensor 看作是一个 n 维的数组或列表. 一个 tensor 包含一个静态类型 rank, 和一个 shape. 想了解 TensorFlow 是如何处理这些概念的, 参见Rank, Shape, 和 Type

2.基于TensorFlow的逻辑回归

  Logistic Regression是一种基于概率的线性分类器。它由一个权重矩阵WW和偏差向量bb参数组成。逻辑回归将输入向量投影到一组超平面,每个超平面代表着一个分类。输入向量到超平面的距离反映了此向量属于超平面对应分类的概率。 
 
在数学上,输入向量xx属于类别ii,即随机变量YY的值概率PP,定义如下

  为了获得模型的最优参数,我们需要定义最小化损失函数;通过求解最小化损失函数,学习最优参数。在多分类情况下,通常利用负对数似然函数作为损失函数。相当于在模型参数θθ下最大化数据集DD的似然函数。我们先定义一下似然函数LL和损失函数

  在机器学习和深度学习算法中,我们的主要目标都是致力于损失函数的最小化方法,得到模型最优参数,提高模型准确率;至今为止,梯度下降方法是最小化任意非线性函数的最简单的方法。

主程序:

# -*- coding: utf-8 -*-
from __future__ import print_function
import tensorflow as tf

# Import MNIST data
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/data/", one_hot=True)

# Parameters
learning_rate = 0.01
training_epochs = 25
batch_size = 100
display_step = 1

# tf Graph Input
x = tf.placeholder(tf.float32, [None, 784]) # mnist data image of shape 28*28=784
y = tf.placeholder(tf.float32, [None, 10]) # 0-9 digits recognition => 10 classes

# Set model weights
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))

# Construct model
pred = tf.nn.softmax(tf.matmul(x, W) + b) # Softmax

# Minimize error using cross entropy
cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred), reduction_indices=1))
# Gradient Descent
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

# Initialize the variables (i.e. assign their default value)
init = tf.global_variables_initializer()

# Start training
with tf.Session() as sess:

    # Run the initializer
    sess.run(init)

    # Training cycle
    for epoch in range(training_epochs):
        avg_cost = 0.
        total_batch = int(mnist.train.num_examples/batch_size)
        # Loop over all batches
        for i in range(total_batch):
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            # Run optimization op (backprop) and cost op (to get loss value)
            _, c = sess.run([optimizer, cost], feed_dict={x: batch_xs,
                                                          y: batch_ys})
            # Compute average loss
            avg_cost += c / total_batch
        # Display logs per epoch step
        if (epoch+1) % display_step == 0:
            print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(avg_cost))

    print("Optimization Finished!")

    # Test model
    correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
    # Calculate accuracy
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    print("Accuracy:", accuracy.eval({x: mnist.test.images, y: mnist.test.labels}))

  最终准确率在91%左右,由此可见,基于TensorFlow的逻辑回归算法的准确率还比较乐观

3.心得体会

  TensorFlow™ 是一个采用数据流图(dataflow graphs),用于数值计算的开源软件库,适用于python,c等语言的编程。它是一款用来做大规模数值计算的库。其所擅长的任务之一就是实现以及训练深度神经网络。除此之外,它还有以下几个显著有点:

 1.可自行设计神经网络结构;

 2.不需要通过反向传播求解梯度,Tensorflow支持自动求导;

 3.通过C++编写核心代码,简化了线上部署的复杂度(通过SWIG实现Python,Go和JAVA接口);

 4.Tensorflow中内置TF.Learn和TF.Slim等组件,并兼容Sciket-learn estimator接口(evaluate、grid、search、cross、validation);

 5.数据流式图支持自由的算法表达,可实现深度学习以外的机器学习算法;

 6.可写内层循环代码控制计算图分支的计算,可将相关的分支转化为子图并执行迭代计算;

 7.可进行并行设计,充分利用硬件资源。 

 8.具有灵活的移植性,编译速度较快;

  它作为八大机器学习框架之一,具有其他框架所不具有的优势,但是因为其兼容性和对python版本的要求,我在安装和运行的过程中遇到了很多麻烦。以及在运行部分程序的时候,还是存在一定的问题,这一个周的学习时间对我来说并不足够,所以要想真正运用好TensorFlow这一个软件库,还需要多次运用,实时关注其官网上的动态。

 


你可能感兴趣的:(TensorFlow初探(撞得满头大包))