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

土法神经网络 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

您也许喜欢这些文章

集智专栏

边看边练的简明机器学习教程 Part I

发表至系列教程
来自 Google 的 Yufeng Guo 尝试把常人眼中高大上的机器学习用最直观、简短的方式传授与你,你可以选择静静地看视频,看完第二天忘了;也可以看完视频自己哼哧哼哧地去搭建环境练习代码;又或者,你可以在集智一边看视频一边在线调戏代码。省时省力,岂不美哉?
集智专栏

水师提督速成指南:用Keras打造你的AI水军

发表至趣味项目
借助Keras,让AI为你创造以假乱真的顾客评论!
集智专栏

数学不行还学AI - 第5话 - 神经网络平话演义(下)

发表至趣味项目
《神经网络平话演义》下集,承接上集,对神经网络的一些重要概念进行了概括总结,并对人工智能的发展和未来做了展望。

文章评论(0)