第八章 深度学习软件
Pytorch、TensorFlow
8.1 CPU vs GPU
CPU:中央处理器
GPU:图形处理单元
比较:
CPU少于10个cores,GPU数千个cores(核)
CPU系统缓存,GPU独立RAM
单个core的处理速度,GPU<<CPU
(GPU非常擅长类似矩阵乘法的,高重复性工作,包括卷积运算)
cuDNN:大约3倍的性能增幅
8.2 Deep Learning Frameworks
学术界一代:caffe、Torch、Theano
产业界二代:caffe2、PyTorch、TensorFlow
产业界三代:Paddle、CNTK、MXNet
计算图:Computational Graphs
框架优势:
1.轻松地构建和使用一个庞大的计算图
2.轻松地使用计算图来计算梯度和损失
3.高效地在GPU上运行
numpy对比框架存在的缺点:
只能够在CPU上运行,无法使用GPU加速
必须自己计算梯度
使用框架的目的:
像numpy一样轻松地实现前向传播的代码
能够自动计算梯度
8.2.1 TensorFlow Neural Net
实例:
#导入库
import numpy as np
import tensorflow as tf
#定义计算图,可重复运行的图模型
N,D,H =64,1000,100
#建立输入槽,定义结点
x = tf.placeholder(tf.float32,shape=(N,D))
y = tf.placeholder(tf.float32,shape=(N,D))
w1= tf.placeholder(tf.float32,shape=(D,H))
w2= tf.placeholder(tf.float32,shape=(H,D))
#执行操作,变量计算
h = tf.maximum(tf.matmul(x,w1),0)
y_pred = tf.matmul(h,w2)
diff = y_pred - y
loss = tf.reduce_mean(tf.reduce_sum(diff**2,axis=1)) #目标值和预测值间的L2损失
#自动计算梯度
grad_w1,grad_w2 = tf.gradients(loss,[w1,w2])
with tf.Sesion() as sess:
values = {x:np.random.randn(N,D), #创建具体数值
w1:np.random.randn(D,H),
w2:np.random.randn(H,D),
y:np.random.randn(N,D),}
#实际运算,确定输出
out = sess.run([loss,grad_w1,grad_w2],
feed_dict=values)
loss_val,grad_w1_val,grad_w2_val = out
更新
learning_rate = 1e-5
for t in range(50):
out = sess.run([loss,grad_w1,grad_w2],
feed_dict=values)
loss_val,grad_w1_val,grad_w2_val = out
values[w1] -= learning_rate * grad_w1_val
values[w2] -= learning_rate * grad_w2_val
#CPU和GPU之间的数据传递存在壁障,耗费资源
learning_rate = 1e-5
new_w1 = w1.assign(w1 - learning_rate * grad_w1)
new_w2 = w1.assign(w2 - learning_rate * grad_w2)
with tf.Sesion() as sess:
sess.run(tf.global_variables_initializer())
values = {x:np.random.randn(N,D),
y:np.random.randn(N,D),}
for t in range(50):
loss_val,_ = sess.run([loss,updates],feed_dict=values)
组方法、优化器
N,D,H =64,1000,100
#建立输入槽,定义结点
x = tf.placeholder(tf.float32,shape=(N,D))
y = tf.placeholder(tf.float32,shape=(N,D))
w1= tf.placeholder(tf.float32,shape=(D,H))
w2= tf.placeholder(tf.float32,shape=(H,D))
#执行操作,变量计算
h = tf.maximum(tf.matmul(x,w1),0)
y_pred = tf.matmul(h,w2)
loss = tf.losses.mean_squared_error(y_pred,y)
optimizer = tf.train.GradientDescentOptimizer(1e-3)
updates = optimizer.minimize(loss)
with tf.Sesion() as sess:
sess.run(tf.global_variables_initializer())
values = {x:np.random.randn(N,D),
y:np.random.randn(N,D),}
for t in range(50):
loss_val,_ = sess.run([loss,updates],feed_dict=values)
后续在笔记中完善。。。
keras
8.2.2 Pytorch
三层抽象:张量对象、变量对象、模对象
Autograd、NN、optim、dataloaders、visdom
8.2.3 静态图、动态图
tensorflow–静态–只建立一次、重复使用
pytorch–动态–每次更新重建
执行序列化、loops
8.2.4 caffe
转换图像格式、定义网络、选择优化算法、训练
caffe2