目录
第 10 章高级封装
目前流行的高级封装有四种,分别是-Slim、Keras和.
-Slim是官方给出的比较早的高级包,一些训练好的图像分析模型通过-Slim开源,所以-Slim在图像识别问题上仍然被广泛使用。
与-Slim相比,它是一个更简洁的高级包。这样可以更轻松地完成模型定义、模型训练和模型评估的整个过程。下面给出了LeNet-5模型在MNIST数据集上的实现:
import tflearn from tflearn.layers.core import input_data, dropout, fully_connected from tflearn.layers.conv import conv_2d, max_pool_2d from tflearn.layers.estimator import regression import tflearn.datasets.mnist as mnist trainX, trainY, testX, testY = mnist.load_data( data_dir="./MNIST_data", one_hot=True) # 将图像数据resize成卷积卷积神经网络输入的格式。 trainX = trainX.reshape([-1, 28, 28, 1]) testX = testX.reshape([-1, 28, 28, 1]) # 构建神经网络。 net = input_data(shape=[None, 28, 28, 1], name='input') net = conv_2d(net, 32, 5, activation='relu') net = max_pool_2d(net, 2) net = conv_2d(net, 64, 5, activation='relu') net = max_pool_2d(net, 2) net = fully_connected(net, 500, activation='relu') net = fully_connected(net, 10, activation='softmax') # 定义学习任务。指定优化器为sgd,学习率为0.01,损失函数为交叉熵。 net = regression(net, optimizer='sgd', learning_rate=0.01, loss='categorical_crossentropy') # 通过定义的网络结构训练模型,并在指定的验证数据上验证模型的效果。 model = tflearn.DNN(net, tensorboard_verbose=0) model.fit(trainX, trainY, n_epoch=10, validation_set=([testX, testY]), show_metric=True)
运行结果:
Training Step: 8599 | total loss: 0.16579 | time: 29.478s | SGD | epoch: 010 | loss: 0.16579 - acc: 0.9785 -- iter: 54976/55000 Training Step: 8600 | total loss: 0.14981 | time: 31.360s | SGD | epoch: 010 | loss: 0.14981 - acc: 0.9806 | val_loss: 0.04016 - val_acc: 0.9857 -- iter: 55000/55000 --
Keras 是使用最广泛的深度学习工具之一,其底层可以支持 MXNet、CNTK 和 . Keras API 训练模型可以先定义一个类,然后通过实例中的 add 函数添加网络层。 Keras封装了卷积层、池化层、RNN结构(LSTM、GRN)、全连接层等常见的神经网络结构,可以轻松实现深度神经网络。
除了能够轻松处理图像问题之外,Keras 对循环神经网络的支持也非常出色。使用 Keras API,循环神经网络的循环体结构也可以通过单个命令完成。原来的 Keras API 并不能很好地支持训练数据的处理,基本上所有的数据都需要一次性加载到内存中;其次,原有的 Keras API 无法支持分布式训练。为了解决这两个问题,Keras 提供了一种与原生态更紧密结合的方式。以下代码展示了如何结合 Keras 和原生态 API 来解决 MNIST 问题。
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist_data = input_data.read_data_sets('./MNIST_data', one_hot=True) # 通过TensorFlow中的placeholder定义输入。 x = tf.placeholder(tf.float32, shape=(None, 784)) y_ = tf.placeholder(tf.float32, shape=(None, 10)) net = tf.keras.layers.Dense(500, activation='relu')(x) y = tf.keras.layers.Dense(10, activation='softmax')(net) acc_value = tf.reduce_mean( tf.keras.metrics.categorical_accuracy(y_, y)) loss = tf.reduce_mean(tf.keras.losses.categorical_crossentropy(y_, y)) train_step = tf.train.GradientDescentOptimizer(0.5).minimize(loss) with tf.Session() as sess: tf.global_variables_initializer().run() for i in range(3000): xs, ys = mnist_data.train.next_batch(100) _, loss_value = sess.run([train_step, loss], feed_dict={x: xs, y_: ys}) if i % 1000 == 0: print("After %d training step(s), loss on training batch is " "%g." % (i, loss_value)) print (acc_value.eval(feed_dict={x: mnist_data.test.images, y_: mnist_data.test.labels}))
运行结果:
Extracting ./MNIST_data/train-images-idx3-ubyte.gz Extracting ./MNIST_data/train-labels-idx1-ubyte.gz Extracting ./MNIST_data/t10k-images-idx3-ubyte.gz Extracting ./MNIST_data/t10k-labels-idx1-ubyte.gz After 0 training step(s), loss on training batch is 2.3884. After 1000 training step(s), loss on training batch is 0.0444334. After 2000 training step(s), loss on training batch is 0.0692529. 0.9781
是官方的高级API,所以更好的整合了原生态提供的功能。预定义的函数有限,比如卷积神经网络或者循环神经网络不能很好的实现,也没有办法支持自定义损失函数,所以一般推荐自定义模型。另外,它可以原生支持数据处理流程的接口。
第 11 章可视化
是一个可视化工具,可以通过程序运行过程中的日志文件输出,可视化程序的运行状态。如果程序在不同的进程中运行,它会自动读取最新的日志文件,并呈现当前运行的程序的最新状态。以下代码示例完成了日志输出功能:
import tensorflow as tf input1 = tf.constant([1.0, 2.0, 3.0], name="input1") input2 = tf.Variable(tf.random_uniform([3]), name="input2") output = tf.add_n([input1, input2], name="add") writer = tf.summary.FileWriter("./tf_log", tf.get_default_graph()) writer.close()
运行结果:
然后,使用可视化,运行以下命令:
tensorboard --logdir=./tf_log
为了更好的组织可视化计算节点,支持通过命名空间组织可视化图上的节点。变量命名空间有 tf.和 tf。功能。除了显示计算图的结构外,还可以显示计算图上每个节点的基本信息以及运行时消耗的时间和空间。
可以根据程序的运行过程将相关结果可视化,包括、、AUDIO、TEXT、列。下图是该列在MNIST数据集上训练的可视化结果:
它提供了一个可视化高维向量之间关系的界面,该界面可以很容易地可视化多个高维向量之间的关系。例如,在图像迁移学习中,可以将目标问题的一组图片通过训练好的卷积层得到瓶颈层,而这些瓶颈层向量就是多个高维向量。如果目标问题图像数据集上同种图片经过卷积层后得到的瓶颈层向量在空间上比较接近,那么迁移学习得到的缺点可能会更好。
第12章计算加速
在配置的GPU环境下,如果操作没有明确指定运行设备,则优先使用GPU。不同的版本对 GPU 的支持也不同。如果所有的程序都使用强制设备规范的方法,那么程序的可移植性就会降低。虽然 GPU 可以加速计算,但一般不会将所有操作都放在 GPU 上。一个好的做法是将计算密集型操作放在 GPU 上,而将其他操作放在 CPU 上。
常用的并行化深度学习模型训练方法有两种,即同步模式和异步模式。在并行训练深度学习模型时,不同的设备(GPU或CPU)可以在不同的训练数据上运行这个迭代过程,不同并行模式的区别在于参数更新不同。
异步模式:在每次迭代中,不同的设备会读取参数的最新值,但是由于不同设备读取参数值的时间不同,所以得到的值也可能不同。根据当前参数的值和随机获得的一小部分训练数据,不同的设备分别运行反向传播过程并独立更新参数。可以简单的认为异步模式是一种复制多份的单机模式,每份使用不同的训练数据进行训练。在异步模式下,不同的设备是完全独立的。
同步模式:同步模式下,所有设备同时读取参数值,在反向传播算法完成后同步更新参数值。单个设备不会单独更新参数,而是会等待所有设备完成反向传播,然后再同时更新参数。
暂无评论内容