深度理解TensorFlow框架,编程原理 —— 第二讲 编程接口和可视化工具TensorBoard

上一讲解读了TensorFlow的抽象编程模型。这一讲,我们上手解读TensorFlow编程接口和可视化工具TensorBoard。

TensorFlow支持C++和Python两种接口。C++的接口有限,而Python提供了丰富的接口,并且有numpy等高效数值处理做后盾。所以,推荐使用Python接口。

接下来,我们手把手教大家用Python接口训练一个输入层和一个输出层的多层感知器(MLP),用来识别MNIST手写字数据集。首先我们导入tensorflow库,下载文件到指定目录。

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

# Download and extract the MNIST data set.
# Retrieve the labels as one-hot-encoded vectors.
mnist = input_data.read_data_sets("/tmp/mnist", one_hot=True)

其中read_data_sets()方法是tensorflow例子程序中提供的下载MNIST数据集的方法,直接使用就可完成数据下载。

接下来,我们需要注册一个流图,在里面定义一系列计算操作:

graph = tf.Graph()
# Set our graph as the one to add nodes to
with graph.as_default():
    # Placeholder for input examples (None = variable dimension)
    examples = tf.placeholder(shape=[None, 784], dtype=tf.float32)
    # Placeholder for labels
    labels = tf.placeholder(shape=[None, 10], dtype=tf.float32)

    weights = tf.Variable(tf.truncated_normal(shape=[784, 10], stddev=0.1))
    bias = tf.Variable(tf.constant(0.05, shape=[10]))
    # Apply an affine transformation to the input features
    logits = tf.matmul(examples, weights) + bias
    estimates = tf.nn.softmax(logits)
    # Compute the cross-entropy
    cross_entropy = -tf.reduce_sum(labels * tf.log(estimates),
    reduction_indices=[1])
    # And finally the loss
    loss = tf.reduce_mean(cross_entropy)
    # Create a gradient-descent optimizer that minimizes the loss.
    # We choose a learning rate of 0.05
    optimizer = tf.train.GradientDescentOptimizer(0.05).minimize(loss)
    # Find the indices where the predictions were correct
    correct_predictions = tf.equal(tf.argmax(estimates, dimension=1),
    tf.argmax(labels, dimension=1))
    accuracy = tf.reduce_mean(tf.cast(correct_predictions,
    tf.float32))

其中

graph = tf.Graph()
# Set our graph as the one to add nodes to
with graph.as_default():

这两句是定义流图并且,开始声明流图中的计算操作。 继续阅读深度理解TensorFlow框架,编程原理 —— 第二讲 编程接口和可视化工具TensorBoard

#9 生成对抗网络101 终极入门与通俗解析

我们能生成/创造我们的真实世界,才能说明我们是完完全全理解了它

David 9 要写一期生成对抗网络。

实在是因为,

第一:对抗网络最近太火了。第二:  生成模型太有意思了。让计算机自己去创造东西,不再是科幻!(有用过Prisma的朋友一定体验过)。没体验过的可以瞧瞧这篇文章:”关于Prisma:那些你知道的和不知道的

生成模型通过训练大量数据, 学习自身模型, 最后通过自身模型产生逼近真实分布的模拟分布. 用这个宝贵的”分布”生成新的数据. 因此, 判别模型的目标是得到关于 的分布 P(y|X), 而生成模型的侧重是得到关于X分布 P(y, X) 或 P(x|y)P(y). 即, 判别模型的目标是给定一张图片, 请告诉我这是”长颈鹿”还是”斑马”, 而, 生成模型的目标是告诉你词语: “长颈鹿”, 请生成一张画有”长颈鹿”的图片吧~ 下面这张图片来自slideshare 可以说明问题:

http://www.slideshare.net/shaochuan/spatially-coherent-latent-topic-model-for-concurrent-object
来自: http://www.slideshare.net/shaochuan/spatially-coherent-latent-topic-model-for-concurrent-object

所以, 生成模型可以从大量数据中生成你从未见过的, 但是符合条件的样本.

难怪, 我们可以调教神经网络, 让他的画风和梵高一样. 最后输入一张图片, 它会输出模拟梵高画风的这张图片的油画.

言归正传, 为啥对抗网络在生成模型中受到追捧 ? 生成对抗网络最近为啥这么火 , 到底好在哪里? 

那就必须谈到生成对抗网络和一般生成模型的区别了. 继续阅读#9 生成对抗网络101 终极入门与通俗解析

深度理解TensorFlow框架,编程原理 —— 第一讲 抽象编程模型

最近读到一篇来自慕尼黑工业大学的论文”A Tour of TensorFlow” , 内容比Tensorflow官方文档更全面深刻, 所以把自己的一些读后心得分享给大家. 做成两次博客. 下一讲会在不久后更新.

首先TensorFlow框架大名鼎鼎大家一定听说过,第一, 比较新,第二,是Google开源的大项目,来看看TensorFlow在历史上机器学习时间线:

qq%e6%88%aa%e5%9b%be20161017164108
25年以来发布的机器学习库时间线 来自:论文 “A Tour of TensorFlow”

TensorFlow是不是挺年轻?但是它的名气自发布以来没有下降的态势,相反,很多人把它称作机器学习界的“Android”。可见这个框架多么受人爱戴。

切入正题,TensorFlow是一个全面的可扩展框架,它试图能够支持任何机器学习,建模算法,而且它现在已经支持分布式计算模型。当然,想象空间还不仅这些,怪不得那些人叫它机器学习界的“Android”。

TensorFlow最大的亮点之一是它的抽象编程模型。它使用的流图计算框架是其他机器学习框架中很少见的。因而,执行模型,优化方式等等都和其他框架有所不同:

1.  流图计算框架

先上一张TensorFlow官网gif图,感受下:

tensors_flowing

机器模型在训练时,会有很多次迭代(比如10000次)。而每一次迭代,上图的演示就是一次迭代的过程。训练10000次,这个流图就要“流动”10000次。 继续阅读深度理解TensorFlow框架,编程原理 —— 第一讲 抽象编程模型