按照官网60分钟入门 Gluon 来学的。
ndarray
定义
- 手打普通数组: nd.array(((1,2,3),(5,6,7)))
- 自动填充: nd.ones((2,3))
- 随机填充: nd.random.uniform(-1,1,(2,3))
- 指定数组填充: nd.full((2,3),2.0)
ndarray也有属性:
In: (X.shape, X.size, X.dtype)
out: ((2,3), 6, numpy.float32)
实际发现每次random第一次都一样,也就是种子的一样的
运算
- element-wise 乘:x*y
- 指数: x.exp()
- 转置: x.T ===>尽然是属性?
- 矩阵乘:nd.dot(x,y.T)
- 下标索引: x[1,2]
- 获取y所有行,第二三列: y[:,1:3] ===>这个竟然是可以当左值的
y[:,1:3] = 2
y
[[0.09762704 2. 2.]
[0.68853152 2. 2.]]
创建神经网络
创建一个层
from mxnet import nd
from mxnet.gluon import nn
#创建一个输出为2的全连接层,输入未指定
layer = nn.Dense(2)
layer.initialize()
x = nd.random.uniform(-1,1,(3,4))
#正向传播
layer(x)
创建一个网络
net = nn.Sequential()
with net.name_scope():
# Add a sequence of layers.
net.add(
nn.Conv2D(channels=6, kernel_size=5, activation='relu'),
nn.MaxPool2D(pool_size=2, strides=2),
nn.Conv2D(channels=16, kernel_size=3, activation='relu'),
nn.MaxPool2D(pool_size=2, strides=2),
# 降维,后跟全连接
nn.Flatten(),
nn.Dense(120, activation="relu"),
nn.Dense(84, activation="relu"),
nn.Dense(10)
)
net.initialize()
x = nd.random.uniform(shape=(4,1,28,28))
y = net(x)
===========================================================
这个with怎么这么用?
见:https://blog.csdn.net/bitcarmanlee/article/details/52745676
这里的作用是赋予独一无二的名字
===========================================================
用autograd自动微分
from mxnet import nd
from mxnet import autograd
x = nd.array([[1, 2], [3, 4]])
#attach_grad 之后才能用 分配空间
x.attach_grad()
x.grad
[[0. 0.]
[0. 0.]]
with autograd.record():
y = 2 * x * x
y.backward()
x.grad
[[ 4. 8.]
[ 12. 16.]]
===========================================================
这就自动微分了?我大caffe咋啥都要自己写?
见: https://blog.csdn.net/aws3217150/article/details/70214422
===========================================================
训练
都还好,没啥写的。其中acc函数挺有意思的,见acc.