[MxNet]Lecture01-线性回归从零实现

import mxnet.ndarray as nd
import mxnet.autograd as ag 
import random


num_examples=100
num_inputs=2

w_true=[2,-3.4]
b_true=4.2

x=nd.random_normal(shape=(num_examples,num_inputs))
y=w_true[0]*x[:,0]+w_true[1]*x[:,1]+b_true
y+=.01*nd.random_normal(shape=y.shape)

batch_size=10
def data_iter():
	idx=list(range(num_examples))
	random.shuffle(idx)
	for i in range(0,num_examples,batch_size):
		j=nd.array(idx[i:min(num_examples,i+batch_size)])
		yield nd.take(x,j), nd.take(y,j)

w=nd.random_normal(shape=(num_inputs,1)) #初始化为符合正态分布的随机数
b=nd.zeros((1,)) #注意不能在后面加0,如果加了0,就是二维了,但是目前是一维
params=[w,b]
for param in params:
	param.attach_grad()#不要漏了括号

def net(x):
	return nd.dot(x,w)+b

def square_loss(yhat,y):
	return((yhat-y.reshape(yhat.shape))**2) #让二者的形态相同,以免触发广播

def sgd(params,lr):
	for param in params:
		param[:]=param-lr*param.grad #这里要注意要有个切片,因为param之一是w,而w是ndarray


epoch=15
lr=0.01
for i in range(epoch):
	total_loss=0
	for data, label in data_iter():
		with ag.record():
			output=net(data)
			loss=square_loss(output,label)#loss是是个一维向量
		loss.backward() #不要漏了括号 其等同于 loss.sum().backward()
		sgd(params,lr)
		total_loss+=nd.sum(loss).asscalar()
	print('epoch: %d, average loss: %f'%(i,total_loss/num_examples))

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值