from mxnet import ndarray as nd
from mxnet import autograd
from mxnet import gluon
def transform(data,label):
return data.astype('float32')/255, label.astype('float32')#为啥要除以255?依旧没有明白。
mnist_train=gluon.data.vision.FashionMNIST(train=True,transform=transform)
mnist_test=gluon.data.vision.FashionMNIST(train=False,transform=transform)
batch_size=256
train_data=gluon.data.DataLoader(mnist_train,batch_size,shuffle=True) #借用了gluon的数据迭代器
test_data=gluon.data.DataLoader(mnist_test,batch_size,shuffle=False)
num_inputs=784
num_outputs=10
w=nd.random_normal(shape=(num_inputs,num_outputs))
b=nd.random_normal(shape=(num_outputs)) #注意这里是个一维的数组,不可以写成(num_outputs,1)
params=[w,b]
for param in params:
param.attach_grad()
def softmax(y):
exp=nd.exp(y)
partition=exp.sum(axis=1,keepdims=True)#沿横轴方向想加
return exp/partition
def net(data):
output=nd.dot(data.reshape((-1,num_inputs)),w)+b
return softmax(output)
def cross_entry(output,label):
return -nd.pick(nd.log(output),label)# 记得这个负号,当output对应下标为0时,loss正无穷,pick的意思是,从前面的矩阵的每一行里挑出第label个元素,默认axis=1.
def accuracy(output,label):
return nd.mean(output.argmax(axis=1)==label).asscalar()
def evaluate_accuracy(data_iterator,net):
acc=0.
for data,label in data_iterator:
output=net(data)
acc+=accuracy(output,label)
return acc/len(data_iterator)
def sgd(params,lr):
for param in params:
param[:]=param-lr*param.grad
epochs=15
lr=0.1
for epoch in range(epochs):
train_loss=0.0
train_acc=0.0
for data,label in train_data:
with autograd.record():
output=net(data)
loss=cross_entry(output,label)
loss.backward()
sgd(params,lr/batch_size) #这里要注意除以batch_size
train_loss+=nd.mean(loss).asscalar()
train_acc+=accuracy(output,label)
test_acc=evaluate_accuracy(test_data,net)
print("Epoch %d. Loss: %f, Train acc %f, Test acc %f" %(epoch, train_loss/len(train_data),train_acc/len(train_data),test_acc))
[MXNet]lecture01-多类逻辑回归从零开始
最新推荐文章于 2022-01-08 01:10:57 发布