前馈神经网络 手动实现回归模型

数据集

import torch
from IPython import display
from matplotlib import pyplot as plt
import numpy as np
import random
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
train_sample = 500
train_examples = 7000
w = torch.ones(1,train_sample)*0.0056
train_x = torch.tensor(np.random.normal(0, 1, (train_sample, train_examples)), dtype=torch.float)
labels = torch.mm(w,train_x) + 0.028
plt.figure(figsize=(8,6))
plt.scatter(train_x[0,:],labels)
plt.xlabel("x")
plt.ylabel("y")
plt.show()

在这里插入图片描述

def layer_sizes(X , Y):
    n_x = X.shape[0] #输入层
    n_h = 5 #隐藏层
    n_y = Y.shape[0] #输出层
    return (n_x,n_h,n_y)

def initialize_parameters( n_x , n_h ,n_y):
    W1 = torch.randn(n_h, n_x, requires_grad=True)
    b1 = torch.zeros(n_h, 1, requires_grad=True)
    W2 = torch.randn(n_y, n_h, requires_grad=True)
    b2 = torch.zeros(n_y, 1, requires_grad=True)
    
    parameters = {"W1" : W1,
                  "b1" : b1,
                  "W2" : W2,
                  "b2" : b2 } 
    return parameters

def forward(X , parameters):
    W1 = parameters["W1"]
    b1 = parameters["b1"]
    W2 = parameters["W2"]
    b2 = parameters["b2"]
    A1 = torch.mm(W1, X) + b1
    A2 = torch.mm(W2, A1) + b2
    return A2

def squared_loss(y_hat, y): 
    return (y_hat - y.view(y_hat.size())) ** 2 / 2

def update(y_hat, labels, lr, parameters):
    W1 = parameters["W1"]
    b1 = parameters["b1"]
    W2 = parameters["W2"]
    b2 = parameters["b2"]
    loss = squared_loss(y_hat, labels).mean()
    loss.backward()
    W1.data -= lr * W1.grad
    W2.data -= lr * W2.grad
    b1.data -= lr * b1.grad
    b2.data -= lr * b2.grad
    W1.grad.data.zero_()
    W2.grad.data.zero_()
    b1.grad.data.zero_()
    b2.grad.data.zero_()
    parameters = {
        "W1" : W1,
        "W2" : W2,
        "b1" : b1,
        "b2" : b2
    }
    return loss, parameters



ls = []
learning_rate = 0.001
epoch_nums = 10
n_0, n_1, n_2 = layer_sizes(train_x , labels)
parameters = initialize_parameters(n_0,n_1,n_2)
for epoch in range(epoch_nums):
    y_hat = forward(train_x,parameters)
    loss ,parameters = update(y_hat,labels,learning_rate,parameters)
    ls.append(loss)
    print("epoch:{}, loss:{:.5}".format(epoch, loss))
plt.plot(ls)
plt.xlabel("epoch")
plt.ylabel("loss")
plt.show()

结果

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值