一个2层隐层神经网络解决抑或问题

使用2层隐层,使用sigmoid和ReLU激活。

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

input = np.array([[0, 0], [0, 1], [1, 1], [1, 0]])  # 4 * 2
target = np.array([0, 1, 0, 1]).reshape(4, 1)  # 4 * 1
# input = (input - np.mean(input)) / np.std(input)
# target = (target - np.mean(target)) / np.std(target)

epochs = 100000
lr = 0.01

num_node_1 = 3
num_node_2 = 4

number = 4
W1 = np.random.randn(2, num_node_1) / np.sqrt(number)
W2 = np.random.randn(num_node_1, num_node_2) / np.sqrt(number)
W3 = np.random.randn(num_node_2, 1) / np.sqrt(number)
b1 = np.zeros((1, num_node_1))
b2 = np.zeros((1, num_node_2))
b3 = np.zeros((1, 1))

loss = []
result = []
for epoch in range(epochs):
    # forward
    hidden1_ = np.dot(input, W1) + b1
    hidden1 = 1 / (np.exp(-1 * hidden1_) + 1)

    hidden2_ = np.dot(hidden1, W2) + b2
#     hidden2 = 1 / (np.exp(-1 * hidden2_) + 1)
    hidden2 = np.maximum(hidden2_, 0)

    output_ = np.dot(hidden2, W3) + b3
    output = 1 / (np.exp(-1 * output_) + 1)
    result.append(output)

    # compute the gradient
    error = 0.5 * np.sum((output - target) * (output - target))
    loss.append(error)
    #     if epoch % 5000 == 0:
    #         print(error)
    #         print(np.round(output, 2))

    dout = (output - target) * (1 - output) * output

    dW3 = np.dot(hidden2.T, dout)
    db3 = np.sum(dout, axis=0)
    dhidden2 = np.dot(dout, W3.T) * (hidden2 >= 0)

    dW2 = np.dot(hidden1.T, dhidden2)
    db2 = np.sum(dhidden2, axis=0)
    dhidden1 = np.dot(dhidden2, W2.T) * (1 - hidden1) * hidden1

    dW1 = np.dot(input.T, dhidden1)
    db1 = np.sum(dhidden1, axis=0)

    # backward
    W3 -= lr * dW3
    b3 -= lr * db3
    W2 -= lr * dW2
    b2 -= lr * db2
    W1 -= lr * dW1
    b1 -= lr * db1

plt.plot(loss)

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值