新的TensorFlow概念
创建简单的机器学习系统需要学习一些新的概念。
优化器
上两节介绍的元素已经提示了TensorFlow是如何完成机器学习的。你已学习了如何用张量操作来定义损失函数。缺少的是你不知道如何用TensorFlow进行梯度下降。尽管可以用TensorFlow元素直接用 Python定义优化算法例如梯度下降。tf.train模块提供了很多优化算法。这些算法可以作为TensorFlow 计算图的节点被添加。
我该使用哪个optimizer?
tf.train里有很多可能的optimizer。包括 tf.train.GradientDescentOptimizer, tf.train.MomentumOptimizer, tf.train.AdagradOptimizer, tf.train.AdamOptimizer,等。这些 optimizers有什么区别呢?几乎所有这些优化器都基于梯度下降的思想。我们前面讲的最简单的梯度下降规则是:
W = W − α∇W
数学上,这种更新规则是很基础的。研究者发现很多快速优化算法不需要过多的额外计算。 tf.train.AdamOptimizer是黙认相对稳健的。(很多优化器对超参数的选择很敏感。初学者最好不要使用复杂的方法,除非掌握了不同优化算法的行为)
Summaries and file writers for TensorBoard
可视化的理解张量程序很有用。TensorFlow团队提供了TensorBoard,可以用以这个目 的。 TensorBoard启动网络服务器(黙认为localhost) 来展示TensorFlow 程序。但是程序员要手工的写日志语句。 tf.train.FileWriter() 指明TensorBoard程序的日志目录。tf.summary 写入TensorFlow 汇总到日志目录。这一章我们只使用 tf.summary.scalar,它汇部标量,跟踪损失函数的值。 tf.summary.merge_all() 是有用的日志助手合并多个汇总到一个汇总。
运行下面的命令在存放源代码文件的目录下创建名为“logs”的目录。
$ mkdir logs
运行TensorBoard并传递“logs”目录的位置作为参数:
#$ tensorboard --logdir=./logs
$ tensorboard --logdir=”logs”
打开浏览器并导航到http://localhost:6006, 这是TensorBoard的黙认URL。
您可以在 Eager Execution 中使用 tf.summary 记录变量摘要。例如,要每 100 个训练步骤记录一次 loss 的摘要,请运行以下代码:
#List3-22
logdir = "./log/"
writer = tf.summary.create_file_writer(logdir)
steps = 1000
with writer.as_default(): # or call writer.set_as_default() before the loop.
for i in range(steps):
step = i + 1
# Calculate loss with your real train function.
loss = 1 - 0.001 * step
if step % 100 == 0:
tf.summary.scalar('loss', loss, step=step)
#List3-23_using_tensorboard.py
import os
import io
import time
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
# Create a visualizer object
#summary_writer = tf.summary.FileWriter('tensorboard', tf.get_default_graph())
# Create tensorboard folder if not exists
if not os.path.exists('tensorboard'):
os.makedirs('tensorboard')
logdir = "./tensorboard"
writer = tf.summary.create_file_writer(logdir)
steps = 1000
with writer.as_default():
for i in range(steps):
step = i + 1
loss = 1 - 0.001 * step
if step % 100 == 0:
tf.summary.scalar('loss', loss, step=step)
# Wait a few seconds for user to run tensorboard commands
time.sleep(5)
batch_size = 50
generations = 100
# Create sample input data
x_data = np.arange(1000)/10.
true_slope = 2.
y_data = x_data * true_slope + np.random.normal(loc=0.0, scale=25, size=1000)
# Split into train/test
train_ix = np.random.choice(len(x_data), size=int(len(x_data)*0.9), replace=False)
test_ix = np.setdiff1d(np.arange(1000), train_ix)
x_data_train, y_data_train = x_data[train_ix], y_data[train_ix]
x_data_test, y_data_test = x_data[test_ix], y_data[test_ix]
# Declare placeholders
#x_graph_input = tf.placeholder(tf.float32, [None])
#y_graph_input = tf.placeholder(tf.float32, [None])
# Declare model variables
m = tf.Variable(tf.random.normal([1], dtype=tf.float32), name='Slope')
# Declare model
output = tf.multiply(m, x_data_train, name='Batch_Multiplication')
# Declare loss function (L1)
residuals = output - y_data_train
l1_loss = tf.reduce_mean(tf.abs(residuals), name="L1_Loss")
# Declare optimization function
#my_optim = tf.train.GradientDescentOptimizer(0.01)
#train_step = my_optim.minimize(l1_loss)
# Visualize a scalar
with tf.name_scope('Slope_Estimate'):
tf.summary.scalar('Slope_Estimate', tf.squeeze(m))
我们从命令行运行脚本 01_using_tensorboard.py
:
$ python3
List3-23_using_tensorboard.py
我们然后启动Tensorboard程序:
$ tensorboard --logdir="tensorboard"
然后我们导航浏览器到:
http://127.0.0.0:6006
我们可以指明不同的端口号 --port 6007
(运行于端号 6007)。