1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| import gluonbook as gb from mxnet import gluon, init, autograd from mxnet.gluon import loss as gloss, nn
batch_size = 256 train_iter, test_iter = gb.load_data_fashion_mnist(batch_size)
net = nn.Sequential() net.add(nn.Dense(10))
net.initialize(init.Normal(sigma=0.01))
loss = gloss.SoftmaxCrossEntropyLoss()
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.1})
def accuracy(y_hat, y): return (y_hat.argmax(axis=1) == y.astype('float32')).mean().asscalar()
def evaluate_accuracy(data_iter, net): acc = 0 for X, y in data_iter: acc += accuracy(net(X), y) return acc / len(data_iter)
def train(net, train_iter, test_iter, loss, num_epochs, batch_size, params=None, lr=None, trainer=None): for epoch in range(num_epochs): train_l_sum = 0 train_acc_sum = 0
for X, y in train_iter: with autograd.record(): y_hat = net(X) l = loss(y_hat, y)
l.backward()
if trainer is None: gb.sgd(params, lr, batch_size) else: trainer.step(batch_size)
train_l_sum += l.mean().asscalar() train_acc_sum += accuracy(y_hat, y)
test_acc = evaluate_accuracy(test_iter, net)
print("epoch %d, loss %.4f, train_acc %.3f, test_acc %.3f" % (epoch + 1, train_l_sum / len(train_iter), train_acc_sum / len(train_iter), test_acc))
num_epochs = 5 lr = 0.1 train(net, train_iter, test_iter, loss, num_epochs, batch_size, None, None, trainer)
|