Deep Learning [4] -- a simple softmax model implementation with Gluon

本文介绍了如何使用MXNet的Gluon包构建并训练一个softmax分类模型。首先引入必要的包,加载训练和测试数据集,然后定义并初始化模型,应用softmax变换和损失函数,选择优化器进行模型训练。在训练过程中,Gluon会自动根据数据集确定输入特征的维度,简化了模型构建过程。
摘要由CSDN通过智能技术生成

I. Intro

 上一篇博客中,从零开始实现了 softmax 的单层分类模型,使用了自己定义的 softmax 函数,来对输出矩阵做了个缩小取值范围的概率分布。本次博客,将直接使用 MXNet 提供的 Gluon 包实现更加高效的 softmax model.

II.Get started

  • import package
# tool, gluon, init, loss, nn
from MachineLearning.Utility import utils as tool
from mxnet import gluon, init
from mxnet.gluon import loss as gloss, nn
  • load training and test dataset
# load data
batch_size = 256
train_iter, test_iter = tool.load_data_fashion_mnist(batch_size)
  • define model and initialize it
# define and initialize model
net = nn.Sequential()
net.add(nn.Dense(10))
net.initialize(init.Normal(sigma=0.01))
  • call softmax transformation and loss function
# define loss function
loss = gloss.SoftmaxCrossEntropyLoss()
  • define optimizer
# using sgd to optimize
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.1})
  • training model
# training our model automatically
num_epochs = 5			# total epochs to train
tool.train_ch3(net, train_iter, test_iter,
			 loss, num_epochs, batch_size,
			  None, None, trainer)

III. Summary

 注意最后在tool包中调用的训练模型函数 train_ch3(),他是模型训练的核心函数,前几步都在为使用这个函数做铺垫,有些是数据铺垫,有些是参数铺垫。我们来仔细看看他的参数结构:

def train_ch3(net, train_iter, test_iter,
 			loss, num_epochs, batch_size,
			params=None, lr=None, trainer=None):

接下来,我们来仔细剖析一下,这个函数的内部结构和工作机理。
 1. 首先传入的是一个 nn.Sequential() object,这个 object 是我们利用 Gluon 包生成的。其主要就是搭建我们的模型,之后,我们使用 net.add(nn.Dense(10)) 语句,向我们生成的神经网络层序列对象添加了一个输出层叫做 Dense(10) 当然其参数是10, 表示输出层的种类有10种,对应了我们使用的分类数据集 Fashion-MNIST 中包括T-shirt、pullover、sandal…在内的十种服装类型。通过使用net对象,就可以减少我们手动对输入特征向量和权值参数、偏差参数做显示的向量运算,这一步全部 由这个nn(neural network) 的 net 对象帮我们自动完成了。

 这时有些读者朋友就会有这么一个疑惑了?net 对象在进行模型计算时,为什么不需要用户提供一个输入层呢?例如这样:

net = nn.Sequential()
# corresponding to total pixels of each graphics 
net.add(nn.Dense(784)		
net.add(nn.Dense(10))
net.initialize(init.Normal(sigma=0.01))

 However, we don’t need to do that. Gluon 包中的 nn 神经网络层将会根据我们训练函数中传入的 training dataset and test dataset 自动识别出我们的输入特征的维度,并自动添加到运算中。这便可以省去输入数据的各种参数麻烦。也是 MXNet Framework 的一大优点。

 2. 紧接着便是传入了train_iter, test_iter 两个迭代器,来按 batch_size 大小读取数据,这里我们把 batch_size 的大小设为256,这是个 hyperparameter(超参数),所以需要不断试错找到最佳值。中间三个参数分别是损失函数(loss),训练周期(num_epochs),批量值(batch_size)。

 3. 最后三个参数,需要注意一下。他们分别是params=None, lr=None, trainer=None。 显然他们都有默认值(带默认值的参数必须置于参数列表末尾), 这就表示他们在模型训练时可以省略。读者需要理解的时,这里的三个参数并不能全省。可以把他们分成两组:A: params & learning rate, B: trainer。A 组两个参数传入的是包括权值参数( W )、偏差参数( b )等参数列表和一个超参数学习率( lr )。B 组直接传入一个trainer对象。当然在构造这个trainer的构造函数中,我们实际上也是把 params 和 learning_rate 作为参数传入了进去。

# using sgd to optimize
trainer = gluon.Trainer(net.collect_params(),
			 'sgd', {'learning_rate': 0.1})

 由此可见这两种方法实质所完成的功能是一样的:就是告诉神经网络训练的初始参数是怎样的,学习率是多少。
Happy Coding.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值