您的位置:首页 > 其它

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

2018-01-09 21:32 796 查看
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))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: