# 线性回归 # 创建数据集 from mxnet import ndarray as nd from mxnet import autograd as ad num_input = 2 num_examples = 1000 true_w = [2, -3.4] true_b = 4.2 x = nd.random_normal(shape=(num_examples, num_input)) y = true_w[0] * x[:, 0] + true_w[1] * x[:, 1] + true_b y += .01 * nd.random_normal(shape=y.shape) print(x[0:10], y[0:10]) # 数据读取 import random 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(i + batch_size, num_examples)]) yield nd.take(x, j), nd.take(y, j) # 返回这两个数,对应下面的data,label,每次在在十个里面拿一个样例和一个结果 for data, label in data_iter(): print(data, label) # 查看要取多少次 n = 0 for data, label in data_iter(): n = n + 1 print(n) # 要取100次,因为有1000个样例,每次取10个 # 初始化模型参数 w = nd.random_normal(shape=(num_input, 1)) b = nd.zeros((1,)) params = [w, b] # 之后需要不断地更新w,b,更新模型 for param in params: param.attach_grad() # 定义模型 def net(x): return nd.dot(x, w) + b print(net(data)) # 损失函数,用来衡量预测值与真实值的差距 # 一般使用平方误差来衡量 def square_loss(yhat, y): return (yhat - y.reshape(yhat.shape)) ** 2 # 加入reshape的作用是防止yhat是行,而y是列这种错误,用reshape进行广播纠错改正 # 优化,sgd函数使用随机梯度下降的算法,最终的目标就是让loss尽可能地小 def sgd(params, lr): for param in params: param[:] = param - lr * param.grad # 训练模型 epochs = 5 # 表示为我要对数据扫5遍 learning_rate = 0.001 for e in range(epochs): total_loss = 0 for data, label in data_iter(): with ad.record(): output = net(data) loss = square_loss(output, label) loss.backward() sgd(params, learning_rate) # 优化误差 total_loss += nd.sum(loss).asscalar() # 求和,asscalar的作用是让最终值成为浮点数 print("Epoch %d,average loss: %f" % (e, total_loss / num_examples))#打印出来每一步的平均误差 print(true_w, w)#打印出最终训练之后的w和b与真实的w和b的差距 print(true_b, b)