《动手学深度学习》 Softmax with gluon

Softmax

用mxnet写softmax, epoch_num没有设置的太大,跑几次看看结果。
因为引入exp函数,在数字太大时会报错,可能不收敛。

代码

import mxnet
import d2lzh as d2l
from mxnet import autograd


batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist((batch_size))

net = mxnet.gluon.nn.Sequential()  # 容器
net.add(mxnet.gluon.nn.Flatten())  # 平滑
net.add((mxnet.gluon.nn.Dense(10)))  # 全连接层,10个输出
net.initialize(mxnet.init.Normal(sigma=0.01))  # 初始化

loss = mxnet.gluon.loss.SoftmaxCrossEntropyLoss()  # 定义损失函数Softmax

trainer = mxnet.gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.1})  # 训练器初始化

num_epochs = 5
lr = 0.1
for epoch in range(num_epochs):
    train_l_sum, train_acc_sum, n = 0.0, 0.0, 0
    for X, y in train_iter:
        with autograd.record():
            y_hat = net(X)
            l = loss(y_hat, y).sum()
        l.backward()  # 求导
        trainer.step(batch_size)  # 迭代并更新
        y = y.astype('float32')
        train_l_sum += l.asscalar()
        train_acc_sum += (y_hat.argmax(axis=1) == y).sum().asscalar()
        n += y.size
    test_acc_sum, test_n = 0.0, 0
    for test_X, test_y in test_iter:
        test_y = test_y.astype('float32')
        test_acc_sum += (net(test_X).argmax(axis=1) == test_y).sum().asscalar()
        test_n += test_y.size
    test_acc = test_acc_sum / test_n
    print('epoch {}, loss {:.4f}, train acc {:.3f}, test_acc {:.3f}'.format(epoch + 1, train_l_sum / n, train_acc_sum / n, test_acc))

结果

epoch 1, loss 0.7893, train acc 0.746, test_acc 0.808
epoch 2, loss 0.5745, train acc 0.811, test_acc 0.826
epoch 3, loss 0.5291, train acc 0.824, test_acc 0.827
epoch 4, loss 0.5052, train acc 0.830, test_acc 0.837
epoch 5, loss 0.4896, train acc 0.834, test_acc 0.842

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值