оригинал:Deep Learning From Scratch VI: TensorFlow
Перевод: Роза
Рецензент: Сунь Имэн
TensorFlow
Закончив нативную нейронную сеть, давайте сделаем что-нибудь профессиональное: займемся настоящим TensorFlow!
Поскольку принцип работы TensorFlow точно такой же, как у нашей реализации нативного метода, почему бы не использовать нативный метод? Причины следующие:
-
В TensorFlow есть готовые и эффективные реализации различных алгоритмов, связанных с нашим нативным методом, которые много лет отшлифовывались его командой, а в Google есть группа экспертов, занимающихся оптимизацией реализации этих алгоритмов. Так что нам не нужно знать эти детали алгоритма. Нам просто нужно знать, что эти алгоритмы делают концептуально (в этом разделе) и как их вызывать.
-
TensorFlow может обучать нейронные сети на графических процессорах, обеспечивая значительное ускорение с массовыми параллельными операциями.
-
Google создает Tensor Processing Unit (TPU), аппаратное устройство, созданное специально для запуска и обучения TensorFlow Graph, с более высокой скоростью.
-
TensorFlow имеет множество встроенных архитектур нейронных сетей, и реализовать их самостоятельно может быть обременительно.
-
TensorFlow предоставляет высокоуровневый API под названием Keras, который можно использовать для построения архитектур нейронных сетей, что намного проще, чем самостоятельное определение графа вычислений.
Установить TensorFlow очень просто.
Может относиться кОфициальная документация TensorFlow Китайская версия.
В коде импорт выглядит следующим образом:
import tensorflow as tf
Поскольку синтаксис нашего нативного метода смоделирован по образцу TensorFlow, мы уже знакомы с тем, как использовать TensorFlow. Нам просто нужно внести следующие изменения:
- Префикс всех вызовов функций и классов с
tf.
. - После построения графика вызовите
session.run(tf.global_variables_initializer())
В остальном все точно так же.
Давайте создадим многослойный персептрон из предыдущего раздела с помощью 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')