深度学习-->线性回归模型

发布时间 2023-07-26 14:36:44作者: o-Sakurajimamai-o
# 线性回归

# 创建数据集
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)