CPU(central processing unit)、 GPU(graphics processing unit)、 TPU(tensor processing unit)
GPU编程:CUDA(on NVIDIA only)、 OpenCL(on anything), 注意采用parallel programming。
从硬盘读取数据过程中,注意以下几点:将所有数据读取到RAM中,使用SSD代替HDD硬盘,使用多个CPU线程预取数据。
framworks: Caffe, Caffe2, Torch, PyTorch, Theano, TensorFlow, MXNet, PaddlePaddle, CNTK ......
它们都可以运行在GPU上,能够自动计算梯度。重点介绍Facebook的Pytorch和Google的TensorFlow。
使用PyTorch的整个代码优化过程:Tensors传统类numpy的前向+后向代码->Autograd简化后向传播过程代码->nn模块简化前向传播代码->optim模块集成的optimization方法,除了使用nn自带的层还可以自定义新的层模块,并且可以将其一并使用在nn.Sequential中。小技巧:使用DataLoader重新定义x和y集合,它不仅提供了集合的数据,还提供minibatching、shuffling、multithreading功能。当然可以利用torchvision使用已有的网络模型,比如torchvision.models.resnet101。同时PyTorch也提供了可视化工具:visdom
#PyTorch简单网络,循环内动态构建computation graph
import torch
from torch.utils.data import TenssorDataset, DataLoader
N, D_in, H, D_out = 64, 1000, 100, 10
x = torch.randn(N, D_in)
y = torch.randn(N, D_out)
loader = DataLoader(TensorDataset(x, y), batch_size=8)
model = torch.nn.Sequential(
torch.nn.Liner(D_in, H),
torch.nn.ReLU(),
torch.nn.Liner(H, D_out))
learning_rate=1e-3
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
for epoch in range(20):
for x_batch, y_batch in loader:
y_pred = model(x_batch)
loss = torch.nn.functional.mse_loss(y_pred, y_batch)
loss.backward()
optimizer.step()
optimizer.zero_grad()
使用TensorFlow的整个代码优化过程与PyTorch类似,都是使用了集成的module,不同的是TensorFlow需要写定义出computation graph然后再在tf.Session()中反复运行,而PyTorch是在反复的运行中动态地构建graph。TenorFlow整个的官方资源都相当的完善,官网或github上可学习。TensorFlow的可视化工具:Tensorboard。
#TensorFlow简单网络,循环外静态定义comutation graph
#可以利用keras进一步简洁网络的构造代码
N, D, H = 64, 1000, 100
x = tf.placeholder(tf.float32, shape=(N, D))
y = tf.palceholder(tf.float32, shape=(N, D))
init = tf.variace_scaling_initializer(2.0)
h = tf.layers.dense(inputs=x, units=H,
activation=tf.nn.relu, kernel_initializer=init)
y_pred = tf.layers.dense(inputs=h, units=D, kernel_initializer=init)
loss = tf.losses.mean_squared_error(y_pred, y)
optimizer = tf.train.GradientDescentOptimizer(1e-2)
updates = optimizer.minimize(loss)
withi tf.Session() as sess:
sess.run(tf.global_variables_initializer())
values = {x: np.random.randn(N, D), y: np.random.randn(N, D),}
for epotch in range(20)
loss_val, _ = sess.run([loss,updates],feed_dict=values)