点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
本文转自:视学算法
神经网络概论
作者说,神经网络并不复杂!
“神经网络”一词很流行,人们通常认为它很难,但其实要简单得多。
是不是这样呢?先看再说。
神经网络的理解主要分为三个部分,神经元、神经网络的构建、训练神经网络。
神经元——神经网络的基本单元
这是2-input神经元的样子。
首先神经元接受输入x1、x2,进行一些数学运算以后,然后产生一个输出y。
在神经元里,通常会发生三件事:
1、每个输入乘以相应的权重;
2、将所有加权输入加在一起,在加上一个偏差b;
3、导入一个激活函数,得到输出y。
通常来说,激活函数使用Sigmoid函数,也就是常说的S型函数,输入任意值(-∞,+∞),最后输出都能停留在0-1之间。
对此,他还举了一个简单的例子。
以激活函数是S型函数、2输入神经元为例,设置参数 w=[0,1] (w1=0,w2=1),b=4。
input:x=[2,3]
output:y=0.999
这也就是最为朴素的神经网络——前馈神经网络。
对此,作者还用Python实现了整个过程。
import numpy as npdef sigmoid(x):# Our activation function: f(x) = 1 / (1 + e^(-x))return 1 / (1 + np.exp(-x))class Neuron:def __init__(self, weights, bias):self.weights = weightsself.bias = biasdef feedforward(self, inputs):# Weight inputs, add bias, then use the activation functiontotal = np.dot(self.weights, inputs) + self.biasreturn sigmoid(total)weights = np.array([0, 1]) # w1 = 0, w2 = 1
bias = 4 # b = 4
n = Neuron(weights, bias)x = np.array([2, 3]) # x1 = 2, x2 = 3
print(n.feedforward(x)) # 0.9990889488055994
构建神经网络
神经元连接在一起就是神经网络。
两个输入,一个含有两个神经元的隐藏层,一个含有1个神经元的输出层就构建了一个神经网络。
需要注意的是,可以用多层隐藏层。就比如,像这样:
我们仍以上个示例的条件为例。
一个神经网络可以包含任意数量的层和任意数量的神经元。
以Python代码示例如下:
import numpy as np# ... code from previous p hereclass OurNeuralNetwork:'''A neural network with:- 2 inputs- a hidden layer with 2 neurons (h1, h2)- an output layer with 1 neuron (o1)Each neuron has the same weights and bias:- w = [0, 1]- b = 0'''def __init__(self):weights = np.array([0, 1])bias = 0# The Neuron class here is from the previous pself.h1 = Neuron(weights, bias)self.h2 = Neuron(weights, bias)self.o1 = Neuron(weights, bias)def feedforward(self, x):out_h1 = self.h1.feedforward(x)out_h2 = self.h2.feedforward(x)# The inputs for o1 are the outputs from h1 and h2out_o1 = self.o1.feedforward(np.array([out_h1, out_h2]))return out_o1network = OurNeuralNetwork()
x = np.array([2, 3])
print(network.feedforward(x)) # 0.7216325609518421
训练神经网路——计算损失函数
假设,我们正在处理以下这个项目。通过人员的体重和身高来判断性别。
以weight、height作为输入,以gender作为输出。
将Male设置为0,Female设置为1,还对其余数据进行了简化。
在训练神经网络之前,首先需要一个方法来量化它做得有多“好”,是否能够做得“更好”,那就是损失函数(loss)。
这里,我们将使用损失函数的一种——均方误差来计算。
预测结果越好,说明损失也就会越低。而训练神经网络的目的,就在于尽可能的减少损失。
如果我们确信所有的人都是Male,也就是说预测值为0,会出现什么样的结果?
Python示例:
import numpy as npdef mse_loss(y_true, y_pred):# y_true and y_pred are numpy arrays of the same length.return ((y_true - y_pred) ** 2).mean()y_true = np.array([1, 0, 0, 1])
y_pred = np.array([0, 0, 0, 0])print(mse_loss(y_true, y_pred)) # 0.5
训练神经网络——最小化损失
计算了损失函数之后,就需要将损失最小化,这也是训练神经网络的最终目的所在。
接下来帖子有一段多变量演算,涉及微积分。
作者表示,
如果对微积分不满意,可随时跳过。
简单起见,我们就假设这个数据集中只有Alice。
那么,它的损失函数就是这样。
那么它的权重w跟偏差b,在图上标示,那么就有6个权重变量,3个偏差变量。
于是,便将损失函数写为多变量函数。
想象一下,我们只要调整w1,就可能导致L的变化。那具体是如何变化的呢?这就需要计算偏导数了。
利用链式求导法则进行反向求导,而这一过程就叫做反向传播。
详细计算过程就不放在这里了,大家去他个人网站去看哦~(链接已附文末)
作者温馨提示,看这个过程的时候不要着急,拿出手中的笔和纸,能够帮助你理解。
接下来,使用随机梯度下降的优化算法,公式表示如下(以w1为例):
其中的“学习速率”控制着训练速度,过大或者过小都不合适。
如果我们将所有的变量都进行这样的优化,那么损失函数将逐渐减少,神经网络就能够得到改善。
简单来说,整个训练过程是这样的:
1、数据集中选择一个样本,就如Alice。
2、利用反向传播计算所有变量的偏导数。
3、使用随机梯度下降来训练神经网络,更新变量。
4、返回步骤1。
神经网络的部分就介绍到这里,怎么样?看完之后,有什么感想?
是不是觉得神经网络也还好了。还有其他概念等着你来学习呢!
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~