[MXNet]lecture01-多类逻辑回归从零开始

本文展示了一个使用MXNet框架对FashionMNIST数据集进行图像分类的完整示例,包括数据预处理、定义模型、损失函数及优化器,并通过小批量随机梯度下降法进行模型训练。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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))

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值