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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| import gluonbook as gb from mxnet import autograd, nd
batch_size = 256 train_iter, test_iter = gb.load_data_fashion_mnist(batch_size)
num_input = 784
num_output = 10
weight = nd.random.normal(scale=0.01, shape=(num_input, num_output))
bias = nd.zeros(num_output)
weight.attach_grad() bias.attach_grad()
def softmax(X): X_exp = X.exp() partition = X_exp.sum(axis=1, keepdims=True) return X_exp / partition
def net(X): return softmax(nd.dot(X.reshape((-1, num_input)), weight) + bias)
def cross_entropy(y_hat, y): return - nd.pick(y_hat, y).log()
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)
num_epochs = 5 lr = 0.1
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))
train(net, train_iter, test_iter, cross_entropy, num_epochs, batch_size, [weight, bias], lr, None)
|