cs231n_2018_lecture08_notes_nn硬软件平台

CS231n课程从lecture08后面就没有相对官方、认可度高的整理过的笔记了。本文将针对lecture08该PPT做些简单的笔记工作。


  •    要点:神经网络的硬件和软件平台

在课件最开始总结了lecture07讲的关键:

  1. optimization的选择——SGD+Momentum,Nesterov,RMSProp,Adam
  2. dropout正则化可以看作是在  网络的前向传播过程中加噪  ,同样思想的也有 stochastic pooling,fractional pooling,data augmentation...
  3. transfer learning注意其与finetune的区别,冻结“特征提取”的所有层

 

  • 硬件平台

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)

 

你可能感兴趣的:(神经网络,cs231n,神经网络,硬软件平台,cv)