mxnet出了gluon好久了,沐神也出了一系列精品课程,这么好的东西就系统的看了一遍教程。做了如下笔记,希望以后回顾的时候能有些用处。
另外,gluon有自己的官方中文社区,而且有大牛坐镇,推荐!
0 什么是Gluon ?
如解浚源知乎中所言:
Gluon是MXNet的动态图接口;Gluon学习了Keras,Chainer,和Pytorch的优点,并加以改进。接口更简单,且支持动态图(Imperative)编程。相比TF,Caffe2等静态图(Symbolic)框架更加灵活易用。同时Gluon还继承了MXNet速度快,省显存,并行效率高的优点,并支持静、动态图混用,比Pytorch更快。
1 预备知识
1.1 NDArray
NDArray 是 MXNet用于储存和变化数据的主要工具。使用方法与Numpy相似。
这里只写一下数据替换操作
from mxnet import ndarray as nd
x=nd.ones((3,4))
y=nd.ones((3,4))
y=y+x #此时等号左右两边的y不是同一个id
#下面两种方法可避免新内存开销
y[:]=y+x#此时等号左右两边相同
y+=x#此时等号左右两边相同
###
z=nd.zeros_like(x)
z[:]=x+y #此时z的id相同,但是仍有额外临时x+y的开销,下面方法可避免
nd.elemwise_add(x,y,out=z)
1.2 autograd自动求导
mxnet.autograd可以方便对算式记性求导,使用方法:
import mxnet.ndarray as nd
import mxnet.autograd as ag
# f=2*x*x
x=nd.array([[1,2],[3,4]])
x.attach_grad()# 对x求导,先开辟导数所需要的空间
with ag.record():
y=2*x*x
y.bachward()
print(x.grad)
另外还可以将链式求导的head gradient 显示的作为backward的参数
2 深度学习基础
2.1 线性回归
这节的意义在于手动实现一遍使用SGD求解线性回归的过程。对于新手还是挺重要的。
所谓线性回归就是对于数据x及目标y,求映射参数w和b使得,yhat=xw+b
与y的值尽量接近,即sum((yhat-y)^2)
最小,求解伪代码如下:
for batch(x,y) in data_iter():
with autograd.record():
yhat=dot(x,w)+b# x,w需要事先attach_grad
loss=sum((yhat-y)^2)
loss.backward()
for p in [w,b]:
w[:]=w-lr*w.grad#注意替换的用法哦; 这里的grad其实是batch数据的sum,sgd中应该使用平均
下面是gluon的代码
net=gluon.nn.Sequential()
net.add(gluon.nn.Dense(1))#指明输出数量为1
net.initialize()#初始化时默认随机初始化
square_loss=gluon.loss.L2Loss()
trainer=gluon.Trainer(
net.collect_params,
'sgd',
{
'learning_rate':0.1})
###############
epochs = 5
batch_size = 10
for e in range(epochs):
total_loss = 0
for data, label in data_iter:
with autograd.record():
output = net(data)
loss = square_loss(output, label)
loss.backward()
trainer.step(batch_size)
total_loss += nd.sum(loss).asscalar()
print("Epoch %d, average loss: %f" % (e, total_loss/num_example