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

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

您也许喜欢这些文章

机器学习算法分类一览[上]

发表至数据科学
人工智能和机器学习毫无疑问是目前最热的几个科技词汇,可以你真的了解机器学习的本质吗?机器学习又有哪些分类?深度学习和增强学习又是如何区分的?本文将从最基本的机器学习分类开始,由浅至深地介绍各种机器学习方法的原理和具体应用。

[Kaggle] 泰坦尼克号事故分析 02 机器学习

发表至数据科学
书接前文,泰坦尼克号幸存者数据集已经经过了初步的数据清洗,接下来我们将开始应用机器学习技术来挖掘数据之间的深层关系。从线性回归(Linear Regression)到逻辑回归(Logistic Regression),并进行交叉验证(Cross Validation)。

基于TensorFlow用卷积神经网络做文本分类

发表至系列教程
上一篇我们介绍了卷积神经网络(CNN)用于自然语言处理(NLP)的基本原理和概念,本篇将基于开源数值计算框架TensorFlow来实现一个简单的CNN,做烂番茄影评分类。

文章评论(0)