集智专栏
资源加载中,请稍后...
集智专栏

土法神经网络 VI:TensorFlow

孙一萌

原文: Deep Learning From Scratch VI: TensorFlow

翻译:罗莎

审校:孙一萌


TensorFlow

做完了土法神经网络,现在我们来点专业的:上真正的 TensorFlow!

既然 TensorFlow 的运行原理与我们的土法实现是完全相同的,那为什么不用土法的呢?原因有以下几个:

  1. 与我们的土法相关的各种算法,TensorFlow 都有现成的高效的实现,而且它已历经其团队多年的打磨,谷歌有一批专家就专门致力于优化这些算法的实现。所以我们不需要知道这些算法细节。我们只需要知道这些算法在概念上会起到的作用(本节内容),以及如何调用它们。

  2. TensorFlow 可以在 GPU 上训练神经网络,借助大规模的并行运算实现巨大的加速。

  3. 谷歌正在建立 Tensor 处理单元(TPU),一种专为运行和训练 TensorFlow Graph 而建立的硬件设备,能够更好地提高速度。

  4. TensorFlow 内置了许多神经网络体系结构,自己动手实现会非常麻烦。

  5. TensorFlow 提供了名为 Keras 的高级 API,它可以用来构建神经网络体系结构,这比之前我们自己定义计算图要容易得多。

安装 TensorFlow 非常容易。

此处原文不明确,已经删去,安装方式可参考官方文档的汉化版

此汉化文档来自景略集智发起的 TensorFlow 中文化项目

在代码中,导入方式如下:

import tensorflow as tf

由于我们的土法实现的语法仿照了 TensorFlow,因此其实我们已经很熟悉怎样使用 TensorFlow 了。我们只需作出如下更改:

  • 在所有函数调用,以及类的前面加上 tf.
  • 在构建 Graph 之后,调用 session.run(tf.global_variables_initializer())

其他方面就完全一样了。

让我们用 TensorFlow 创建上一节中的多层感知器:

程序说明
TensorFlow
示例代码
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt # 在 (0, 0) 和 (1, 1) 处分别创建两簇红色点 red_points = np.concatenate(( 0.2*np.random.randn(25, 2) + np.array([[0, 0]]*25), 0.2*np.random.randn(25, 2) + np.array([[1, 1]]*25) )) # 在 (0, 1) 和 (1, 0) 处分别创建两簇蓝色点 blue_points = np.concatenate(( 0.2*np.random.randn(25, 2) + np.array([[0, 1]]*25), 0.2*np.random.randn(25, 2) + np.array([[1, 0]]*25) )) # 创建输入 placeholder X = tf.placeholder(dtype=tf.float64) # 为训练分类创建 placeholder c = tf.placeholder(dtype=tf.float64) # 构建隐藏层 W_hidden = tf.Variable(np.random.randn(2, 2)) b_hidden = tf.Variable(np.random.randn(2)) p_hidden = tf.sigmoid( tf.add(tf.matmul(X, W_hidden), b_hidden) ) # 构建输出层 W_output = tf.Variable(np.random.randn(2, 2)) b_output = tf.Variable(np.random.randn(2)) p_output = tf.nn.softmax( tf.add(tf.matmul(p_hidden, W_output), b_output) ) # 构建交叉熵损失 J = tf.negative(tf.reduce_sum(tf.reduce_sum(tf.multiply(c, tf.log(p_output)), axis=1))) # 构建最小化优化器 minimization_op = tf.train.GradientDescentOptimizer(learning_rate = 0.01).minimize(J) # 构建 placeholder 输入 feed_dict = { X: np.concatenate((blue_points, red_points)), c: [[1, 0]] * len(blue_points) + [[0, 1]] * len(red_points) } # 创建 session session = tf.Session() # 初始化 variable session.run(tf.global_variables_initializer()) # 进行 1000 次梯度下降 for step in range(1000): J_value = session.run(J, feed_dict) if step % 100 == 0: print("Step:", step, " Loss:", J_value) session.run(minimization_op, feed_dict) # 输出最终结果 W_hidden_value = session.run(W_hidden) print("Hidden layer weight matrix:\n", W_hidden_value) b_hidden_value = session.run(b_hidden) print("Hidden layer bias:\n", b_hidden_value) W_output_value = session.run(W_output) print("Output layer weight matrix:\n", W_output_value) b_output_value = session.run(b_output) print("Output layer bias:\n", b_output_value) # 可视化分类边界 xs = np.linspace(-2, 2) ys = np.linspace(-2, 2) pred_classes = [] for x in xs: for y in ys: pred_class = session.run(p_output, feed_dict={X: [[x, y]]})[0] pred_classes.append((x, y, pred_class.argmax())) xs_p, ys_p = [], [] xs_n, ys_n = [], [] for x, y, c in pred_classes: if c == 0: xs_n.append(x) ys_n.append(y) else: xs_p.append(x) ys_p.append(y) plt.plot(xs_p, ys_p, 'ro', xs_n, ys_n, 'bo')
程序验证过程
True

您也许喜欢这些文章

集智专栏

卷积滤波器如何提取图像特征

发表至系列教程
答知乎网友问:“为什么卷积滤波器可以提取图片中的不同特征呢?”本文结合女式内衣图像处理的例子,介绍了“卷积”的基本数学原理,演示了卷积核如何提取边缘特征。 这里的“卷积”与积分变换里的“卷积”其实完全不同。
集智专栏

[2018.01.14] “女生科技体验节” TensorFlow Workshop

发表至业界新闻
Kaiser在2018年1月14日“女生科技体验节”主持关于TensorFlow的workshop,这次用Fashion-MNIST替换了过度使用的MNIST(手写数字)数据集,并以此为实例展示TensorFlow的基本操作。
集智专栏

AI会开脑洞么?DeepMind说是的!

发表至业界新闻
长久以来我们都在讨论一个问题——AI能自己思考吗?现在,越来越多的人开始相信,使用深度学习和强化学习打造的人工智能是可以具备思考能力的。而DeepMind的科学家则更进一步,他们已经开始试图让深度强化学习过程中的机器人在训练中具备想象规划能力,并通过例如推箱子之类的游戏来展现他们的研究成果。

文章评论(0)