基于numpy的前馈神经网络(feedforward neural network)

本文介绍了作者在学习Andrew Ng的深度学习课程后,通过动手实现前馈神经网络加深理解。文章详细讲解了前馈神经网络的工作原理,包括其结构、激活函数(如tanh和sigmoid)的作用,以及神经元的线性变换和激活变换过程。作者还讨论了神经网络的训练过程,包括损失函数、梯度下降法和反向传播的概念。最后,作者分享了自己的代码实现,指出简洁和易于理解的重要性,并给出了训练时遇到的问题及解决方案。
摘要由CSDN通过智能技术生成

***
代码部分可以直接通过Jupyter Notebook来查看


这几天在上Andrew Ng教授开的Coursera系列课程Deep Learning,总觉得光是看视频和做作业还不够,还是得自己动手写写代码,亲自实现课程里提到的算法内容,于是便有了这篇博客,作为自己入门深度学习的里程碑吧。

前馈神经网络

机器学习有两个基本问题,一是回归,二是分类,神经网络大多用于解决分类问题,前馈神经网络(feedforward neural network)是整个神经网络家族中较为常见和较为基础的一种,如下图右上角的DFF所示。图片来源是Cheat Sheets for AI, Neural Networks, Machine Learning, Deep Learning & Big Data

神经网络中的基本元素是神经元,每层都有一定数量的神经元,神经元组合的多样性决定了神经网络的丰富性。下面是一个简单的前馈神经网络,总共有三层,从左到右分别是输入层、隐层和输出层,输入层的x1和x2表示这个样本只有两个特征(自变量),因为输入层通常不计入内,所以这是一个两层的神经网络,第一层有4个神经元,第二层只有1个。注意,隐层可以不止一层,隐层设置得越多,整个神经网络越庞大。

这个神经网络的工作原理是,给定一个样本的数据,将数据传输到第一层,进行线性变换和激活变换,得到加工过后的数据,这份新数据传到第二层,作为第二层的输入,接着进行线性变换和激活变换,又得到一份新的数据,因为第二层是最后一层了(如果不止两层就一直进行这样的操作直到抵达最后一层为止),所以最终的输出作为我们对该样本的预测值y_hat。

每一个神经元如同工厂的流水车间的机器,它重复做着四件事情:【接受上一层数据作为输入>>线性变换>>激活变换>>输出数据到下一层】,每个神经元中有三个组成部分:权重(weight)矩阵W,偏置(bias)向量b,以及激活函数(activation function) g,用公式表达为下图,其中上标(i)表示这是第i个样本数据,上标[1]和[2]分别表示这是神经网络的第一层与第二层:

z[1](i)=W[1]x(i)+b[1] z [ 1 ] ( i ) = W [ 1 ] x ( i ) + b [ 1 ]
a[1](i)=tanh(z[1](i)) a [ 1 ] ( i ) = tanh ⁡ ( z [ 1 ] ( i ) )
z[2](i)=W[2]a[1](i)+b[2] z [ 2 ] ( i ) = W [ 2 ] a [ 1 ] ( i ) + b [ 2 ]
y^(i)=a[2](i)=σ(z[2](i)) y ^ ( i ) = a [ 2 ] ( i ) = σ ( z [ 2 ] ( i ) )

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您讲解基于numpy设计神经网络的步骤: 1. 导入numpy库 ``` import numpy as np ``` 2. 定义神经网络的结构,包括输入、隐藏输出的节点数,以及权重和偏置的初始值 ``` input_size = 2 hidden_size = 4 output_size = 1 W1 = np.random.randn(input_size, hidden_size) b1 = np.zeros((1, hidden_size)) W2 = np.random.randn(hidden_size, output_size) b2 = np.zeros((1, output_size)) ``` 3. 定义激活函数,常用的有sigmoid和relu函数 ``` def sigmoid(x): return 1 / (1 + np.exp(-x)) def relu(x): return np.maximum(0, x) ``` 4. 定义前向传播函数,将输入数据通过神经网络得到输出结果 ``` def forward(X): # 第一 z1 = np.dot(X, W1) + b1 a1 = relu(z1) # 第二 z2 = np.dot(a1, W2) + b2 y_hat = sigmoid(z2) return y_hat ``` 5. 定义损失函数,常用的有均方误差和交叉熵函数 ``` def mse_loss(y, y_hat): return np.mean((y - y_hat) ** 2) def cross_entropy_loss(y, y_hat): return -(y * np.log(y_hat) + (1 - y) * np.log(1 - y_hat)).mean() ``` 6. 定义反向传播函数,计算权重和偏置的梯度 ``` def backward(X, y, y_hat): # 输出 dz2 = y_hat - y dW2 = np.dot(a1.T, dz2) db2 = dz2.sum(axis=0, keepdims=True) # 隐藏 da1 = np.dot(dz2, W2.T) dz1 = da1 * (z1 > 0) dW1 = np.dot(X.T, dz1) db1 = dz1.sum(axis=0) return dW1, db1, dW2, db2 ``` 7. 定义更新权重和偏置的函数,采用梯度下降法更新神经网络的参数 ``` def update_params(dW1, db1, dW2, db2, lr): W1 -= lr * dW1 b1 -= lr * db1 W2 -= lr * dW2 b2 -= lr * db2 return W1, b1, W2, b2 ``` 8. 定义训练函数,利用前向传播、反向传播和权重更新来训练神经网络 ``` def train(X, y, epochs, lr): for i in range(epochs): y_hat = forward(X) loss = mse_loss(y, y_hat) dW1, db1, dW2, db2 = backward(X, y, y_hat) W1, b1, W2, b2 = update_params(dW1, db1, dW2, db2, lr) if i % 100 == 0: print(f"Epoch {i}, Loss: {loss:.4f}") return W1, b1, W2, b2 ``` 这些步骤可以帮助您基于numpy设计神经网络,进行训练和预测任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值