numpy实现简单神经网络

一个全连接的 ReLU 神经网络,一个隐藏层,没有 bias,用来从 x 预测 y。

题目要求:
  1. 用 numpy 实现两层神经网络拟合。
  2. 两层线性层:
    h = W1 * x
    h_relu = relu(h)
    y = W2 * x
  3. 优化方法使用随机梯度下降(SGD)
  4. Loss 函数使用均方误差函数(MSE)
代码实现:
import numpy as np

EPOCH = 500
LEARNING_RATE = 1e-6
N, D_in, H, D_out = 64, 1000, 100, 10
X=np.random.randn(N,D_in)
y=np.random.randn(N,D_out)
w1=np.random.randn(D_in,H)
w2=np.random.randn(H,D_out)

#激活函数
def relu(x):
    return np.maximum(0,x)

#损失函数(均方差MSE)
def loss_function(y_pred,y):
    result = np.subtract(y,y_pred)#求差
    result = np.power(result, 2)#差的平方
    result = np.mean(result)
    return result

#求梯度(求导)
def grad(x,y,w1,w2):
    h = np.dot(x, w1)
    h_relu = relu(h)
    y_pred = np.dot(h_relu, w2)

    #L=(R.dot(w2)-y)^2,R=u if u>0 else 0 ,u=X.dot(w1)
    #求对w2的偏导数
    diff=-2*(y-y_pred)#最外层求导
    dw2=h_relu.T.dot(diff)

    #求对w1的偏导数
    dh_relu=diff.dot(w2.T)#L对R求导 dL/dR=diff*w2
    dh = dh_relu.copy()
    dh[h<0]=0#u>0 dR/du=1; u<=0 dR/du=0
    #du/dw1=X
    #dL/dw1= dL/dR * dR/du *du/dw1
    dw1=x.T.dot(dh)
    return dw1,dw2


for i in range(EPOCH):
    #前向传播
    #输入层-》隐含层
    h=np.dot(X,w1)
    h_relu=relu(h)
    #隐含层-》输出层
    y_pred=np.dot(h_relu,w2)

    #计算损失(误差)
    loss=loss_function(y_pred,y)
    if i%50==0:
        print('epoch:',i,'loss:',loss)

    #反向传播,优化方法(SGD)
    for i in range(N):
        index=np.random.randint(N)
        xi=X[index:index+1]
        yi=y[index:index+1]
        #求导
        dw1,dw2=grad(xi,yi,w1,w2)
        #更新权重
        w1=w1-LEARNING_RATE*dw1
        w2=w2-LEARNING_RATE*dw2

print("y:",y)
print("pred_y",y_pred)
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值