使用numpy实现一个简单的2层神经网络

import numpy as np

def main():
    # 2层神经网络,64个输入1000维,1个隐藏层100维,输出10维
    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)
    # 学习率一般选择1e-6~1e-4
    learning_rate = 1e-6
    # 循环迭代学习500次
    for t in range(500):
        # forward pass
        h = x.dot(w1) # N * H
        h_relu = np.maximum(h,0) # N * H
        y_pred = h_relu.dot(w2) # H * D_out

        # compute loss
        loss = np.square(y_pred - y).sum()
        print(t, loss)

        # backward pass
        # compute the gradient
        grad_y_pred = 2.0 * (y_pred - y)
        grad_w2 = h_relu.T.dot(grad_y_pred)
        grad_h_relu = grad_y_pred.dot(w2.T)
        grad_h = grad_h_relu.copy()
        grad_h[h<0] = 0
        grad_w1 = x.T.dot(grad_h)

        # update weights of w1 and w2
        w1 -= learning_rate * grad_w1
        w2 -= learning_rate * grad_w2
        
    # 使用训练好的数据进行预测
    h = x.dot(w1)
    h_relu = np.maximum(h, 0)
    y_pred = h_relu.dot(w2)
    
    # 打印出预测值与实际值的误差
    print(y - y_pred)


if __name__ == '__main__':
    main()

经过500次迭代,损失逐渐减小

490 6.488345724242929e-07
491 6.189309834083105e-07
492 5.904337869152525e-07
493 5.632434702894173e-07
494 5.373005118562679e-07
495 5.125660475282727e-07
496 4.889721590543996e-07
497 4.6647564933752185e-07
498 4.4502716144784435e-07
499 4.245642390520534e-07

进行预测测试,部分结果如下,可见误差已经非常小了

 [-4.05827834e-06 -2.08487774e-05 -1.08563393e-05  2.56239401e-05
   1.21532941e-05  8.19823028e-06 -3.31557266e-05 -5.22064015e-06
  -2.07082664e-05 -9.00997895e-06]
 [ 7.89988666e-06  6.81363721e-06 -1.28522000e-06 -1.39193166e-05
  -1.49279614e-05  1.09177779e-05  2.73508543e-05 -3.20825669e-06
  -6.57302516e-07  4.38394831e-06]]

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我们从头开始搭建一个前馈神经网络。我们需要引入numpy库。 ```python import numpy as np ``` 我们需要定义一个类,叫做`NeuralNetwork`。在类的初始化方法中,我们需要传入神经网络的结构信息,包括输入、输出和隐藏的节点数量。我们还需要定义学习率和迭代次数。 ```python class NeuralNetwork: def __init__(self, input_size, hidden_size, output_size, learning_rate=0.1, num_iterations=1000): self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size self.learning_rate = learning_rate self.num_iterations = num_iterations ``` 接下来,我们需要初始化神经网络的权重和偏置。我们可以使用随机数初始化权重和偏置,但是为了保证每次运行程序结果相同,我们可以使用numpy的随机数生成器,并设置随机数种子。 ```python class NeuralNetwork: def __init__(self, input_size, hidden_size, output_size, learning_rate=0.1, num_iterations=1000): self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size self.learning_rate = learning_rate self.num_iterations = num_iterations # 初始化权重和偏置 np.random.seed(1) self.weights_input_hidden = np.random.randn(self.hidden_size, self.input_size) self.bias_input_hidden = np.zeros((self.hidden_size, 1)) self.weights_hidden_output = np.random.randn(self.output_size, self.hidden_size) self.bias_hidden_output = np.zeros((self.output_size, 1)) ``` 现在,我们需要实现前馈神经网络的主要步骤。前馈神经网络的主要思想是将输入数据传递到输入,通过隐藏最终到达输出。在每一中,我们需要计算权重和偏置的加权和,然后通过激活函数进行非线性转换。最后,我们将输出的结果与真实标签进行比较,并计算误差。 ```python class NeuralNetwork: def __init__(self, input_size, hidden_size, output_size, learning_rate=0.1, num_iterations=1000): self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size self.learning_rate = learning_rate self.num_iterations = num_iterations # 初始化权重和偏置 np.random.seed(1) self.weights_input_hidden = np.random.randn(self.hidden_size, self.input_size) self.bias_input_hidden = np.zeros((self.hidden_size, 1)) self.weights_hidden_output = np.random.randn(self.output_size, self.hidden_size) self.bias_hidden_output = np.zeros((self.output_size, 1)) def sigmoid(self, x): return 1 / (1 + np.exp(-x)) def forward(self, X): # 前向传播 hidden_layer = self.sigmoid(np.dot(self.weights_input_hidden, X) + self.bias_input_hidden) output_layer = self.sigmoid(np.dot(self.weights_hidden_output, hidden_layer) + self.bias_hidden_output) return hidden_layer, output_layer def train(self, X, y): for i in range(self.num_iterations): # 前向传播 hidden_layer, output_layer = self.forward(X) # 计算误差 output_error = y - output_layer hidden_error = np.dot(self.weights_hidden_output.T, output_error) * hidden_layer * (1 - hidden_layer) # 更新权重和偏置 self.weights_hidden_output += self.learning_rate * np.dot(output_error, hidden_layer.T) self.bias_hidden_output += self.learning_rate * np.sum(output_error, axis=1, keepdims=True) self.weights_input_hidden += self.learning_rate * np.dot(hidden_error, X.T) self.bias_input_hidden += self.learning_rate * np.sum(hidden_error, axis=1, keepdims=True) ``` 现在,我们已经完成了神经网络的搭建和训练。让我们使用一个简单的数据集来测试我们的代码。 ```python # 准备数据集 X = np.array([[0, 0, 1, 1], [0, 1, 0, 1]]) y = np.array([[0, 1, 1, 0]]) # 创建神经网络 nn = NeuralNetwork(2, 4, 1) # 训练神经网络 nn.train(X, y) # 测试神经网络 hidden_layer, output_layer = nn.forward(X) print(output_layer) ``` 这个例子使用一个简单的异或数据集。我们期望神经网络能够学习到异或的逻辑运算。输出结果应该是一个接近0或1的向量。你可以尝试使用不同的输入和隐藏节点数量来训练神经网络,并观察输出结果的变化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值