MXNet的学习之路
完成了第一个线性回归模型的训练。
学习了MXNet自动求梯度过程
attach_grad
函数,申请求梯度过程中要的内存。with auto_grad.record()
记录求梯度过程中的信息。backward()
函数自动计算梯度。variables.grad
来获取变量的梯度。学习了从零开始实现线性回归模型网络,训练大致流程如下:
with auto_grad.record()
中计算损失函数的值lossloss.backward()
计算梯度学习了如何生成小批量数据
random.shuffle(num_examples)
随机排序数据yield
每次从总体数据中取出batch_size组数据代码大体如下
def next_minibatch(batch_size,features,labels):
num_examples = len(features)
indices = list(range(num_examples))
random.shuffle(indices)
with mx.gpu():
for i in range(0,num_examples,batch_size):
j = nd.array(indices[i:min(i+batch_size,num_examples)])
yield features.take(j),labels.take(j)
每天进步一点点~
完成了第一个使用gluon接口进行编程的线性回归模型
mxnet.gluon.data
模块的使用,主要是用来处理输入数据:mxnet.gluon.data.ArrayDataset
构造一个dataset类型的数据集mxnet.gluon.data.DataLoader
中的方法读取数据,比如shufflegluon.nn
模块,nn模块中定义了大量的神经网络模型,通常的运用过程如下:net=nn.Sequential()
建立一个神经网络容器,该容器会连接各层神经网络,并将上一层的输出作为下一层的输入net.add(nn.Dense(1))
来添加一个全连接层,Dense表示全连接层,可以自己定义输出维度gluon.loss
模块,其中定义了非常多的损失函数:loss =gluon.loss.L2Loss()
构建损失函数后,用实例化的loss对输入数据进行计算即可学习了gluon.Trainer
模块,其中定义了大量的优化器:
trainer = gluon.Trainer(param)
来定义自己的优化器,具体查看API文档使用gluon接口进行训练模型的过程如下:
dataset
模型提取出小批量的训练数据loss
计算损失函数的值,记住需要在with auto_grad.record()
中进行,记录数值loss.backward()
计算梯度trainer.step(batch_size)
来进行模型参数的迭代优化完成了softmax从零实现、softmax使用gluon接口实现、以及多层感知机从零实现
mxnet.gluon.vision
模块中有大量的数据集,可以使用该模块下载数据集mxnet.Context(contexttype= mx.gpu())
a = a.as_in_context(mx.gpu)
发现一个问题使用 transforms.ToTensor()
函数,当存储空间是GPU时,会报错,好像是该函数没有在GPU上实现
解决方案:
可以自己编写函数在读入数据时进行预处理 lambda函数即可,入口参数为 transform
完成了L2正则化,以及dropout的实现
nn.Dense(activation)
选择不同的激活函数gluon.Trainer
时 ‘wd’ 关键字是L2正则化的超参数,加入之后网络会加上权重衰减nn.Dropout(drop_prob)
来添加一个dropout层,其中drop_prob为超参数nd.random.uniform(low,up)
可以用来生成固定范围的随机数auto_grad.is_training()
可以用来判断是否在训练学习了模型的构造、以及自定义层、和获取模型参数,以及模型参数的存储和读取
nn.Block
类来定义自己的模型__init()__
函数,调用super(name,self).__init__()
父类的初始化函数之后,再进行自己定义的初始化forward()
函数,重写前向运算的函数,从而在其中实现自己的前向运算net.params
可以获取一个ParamDict类型的参数字典net.weight.data()
可以获得权重的实际数据init.Initializer
,来定义自己的权重初始化函数,重写其中的_init_weight(self, name, data)
函数即可initialize()
函数后,模型参数并不会立刻初始化,而是会经过一次前向运算后,再进行初始化。self.params.get(name,shape)
来定义自己的参数net.save_parameters(filenmae)
和net.load_parameters(filename)
来很方便存储和读取模型参数学习了卷积的多输入多输出通道,以及1*1的卷积核
nd.stack()
函数进行拼接。我发现MXNet真的很不错~
学习了各种经典CNN框架的搭建,我发现MXNet真的是个好东西,搭建深度学习模型效率特别高
学习了 批量归一化(BatchNormalization)、残差网络(ResNet)、稠密连接网络(DenseNet)
学习了循环神经网络、语言数据模型。
语言数据模型
char_to_idx
、和idx_to_char
num_steps (时间步长)
,小批量样本形状为(批量大小,时间步长) ,分为随机采样和相邻采样:corpous_indices
,所以随机采样能够得到的最大样本数为 num_examples = (corpous_indices-1) // num_steps
(由于每个样本都有num_step个值)range(num_examples)
并进行 shuffle
操作batch_size
大小个样本,进行训练循环神经网络
rnn.RNN(num_hiddens)
记录:reshape 函数的实现方法是按列选择,第一行第一列、第一行第二列、….、第二行第一列….这样选。