关于 神经网络 的理解
文章目录
- 首语:
- 感知机(神经元)
- 神经网络的结构
- 正向传播
首语:
-学了一个多月的机器学习,对于神经网络才刚刚接触,感知机的实现相对好理解,但神经网络的逻辑较为复杂,在这做一个总结和思考。希望能得到各位大佬的指正。
感知机(神经元)
适合做简单的分类或线性方程, 如判断是不是正数, 无法处理复杂的多维特征
实现:参考
关键的感知机的参数优化方法:
wi = w + n(y- y_pre)xi
bi = b + n(y- y_pre)
神经网络的结构
多个神经元组成
正向传播
h = wi xi + bi
下面进行正向传播的代码实现
def sigmoid(x):return 1/(1 + np.exp(-x))
def loss_mse(y_true, y_pred):return ((y_true - y_pred) ** 2).mean()
def re_sigmoid(x):fx = sigmoid(x)return fx * (1 - fx)
class Neural(object):def feed_forwad(self, x):h1 = sigmoid(w1 * x[0] + w2 * x[1] + b1)h2 = sigmoid(w2 * x[0] + w4 * x[1] + b2)o1 = sigmoid(h1 * w5 + h2 * w6 + b3)return o1
而反向传播的实现比较复杂,解释下, 我们要计算出Loss 对于所有参数的导数,即每个参数会影响到Loss 的变化大小, 然后不断调整参数大小,达到降低loss 的效果。
比如, 影响到打篮球的属性有身高和速度,我们想设计一个算法, 用来判断每个人的打篮球天赋,
通过导数得到 关于身高的比例为0.7, 速度为0.3, 不断调整参数,使得 准确度达到最高。
我们现在的目的就是求出所有的导数,先列出所有的关系函数
Loss = loss_mes = ((y - y') ** 2).mean() #y 和y '是矩阵形式
# dL/dy' = -2 (y - y')
# 往前推
y' = f(w5 * h1+ w6 * h2 + b3) # f为激活函数 h1, h2 为上个神经节点的输出
# dy'/dw5 = h1 * f'(x)
# dy'/dw6 = h2 * f'(x)
# dy'/db3 = f'(x)
# dL/dw5 = dL/dy' * dy'/dw5
# dL/dw6 = dL/dy' * dy'/dw6
# dL/db3 = dL/dy' * dy'/db3
相同的 可以得出
h1 = f(w1 * x[0] + w2 * x[1] + b1)
h2 = f(w3 * x[0] + w4 * x[1] + b2)
dL/dw1 = dL/dy' * dy'/dh1 * dh1/dw1
dh1/dw1 = x[0] * f'(x)
dh1/dw2 = x[1] * f'(x)
dh1/db1 = * f'(x)
dL/dw2 = dL/dy' * dy'/dh2 * dh2/dw2
dh2/dw3 = x[0] * f'(x)
dh2/dw4 = x[1] * f'(x)
dh1/db2 = * f'(x)
接下来 ,直接进行更新
wi = wi - rate * dwi
w1 -= rate * dl/dw1
.....
完整代码如下:
# 訓練神经网络进行性别的判定
import numpy as np
data = np.array([[-2, -1], # Alice[25, 6], # Bob[17, 4], # Charlie[-15, -6], # Diana
])
all_y_trues = np.array([1, # Alice0, # Bob0, # Charlie1, # Diana
])
# 激活函数
def sigmoid(x):return 1/(1+np.exp(-x))def deriv_sigmoid(x):fx = sigmoid(x)return fx * (1 - fx)
def loss_mse(y_true, y_pred):
# 均方误差 损失函数return ((y_true - y_pred) ** 2).mean()class Neural(object):def __init__(self):self.w1 = np.random.normal()self.w2 = np.random.normal()self.w3 = np.random.normal()self.w4 = np.random.normal()self.w5 = np.random.normal()self.w6 = np.random.normal()# 截距项,Biasesself.b1 = np.random.normal()self.b2 = np.random.normal()self.b3 = np.random.normal()self.rate = 0.1def feed_forward(self, x):# 正向传播, 用于评估 损失函数h1 = sigmoid(self.w1 * x[0] + self.w2 * x[1] + self.b1)h2 = sigmoid(self.w3 * x[0] + self.w4 * x[1] + self.b2)o1 = sigmoid((self.w5 * h1 + self.w6 * h2 + self.b3))return o1def train(self, data, y_labels):learn_rate = 0.1epochs = 1000# 每次训练,将先正向传播,在计算损失函数, 然后反向传播,更新参数, ,在正向传播 目的就是为了降低损失函数的值for i in range(epochs):for (x, y_label) in zip(data, y_labels):#1、正向传播sum_h1 = self.w1 * x[0] + self.w2 * x[1] + self.b1h1 = sigmoid(sum_h1)sum_h2 = self.w3 * x[0] + self.w4 * x[1] + self.b2h2 = sigmoid(sum_h2)sum_o1 = self.w5 * h1 + self.w6 * h2 + self.b3o1 = sigmoid(sum_o1)#2、计算损失函数# 损失函数求导 1/n(y_true - y_pred) ** 2 = 0 + (-1) * 2 * (y_true - y_pred)dL_j = -2 * (y_label - o1)#3、 反向传播#dw1... dw6 #求j 的值#j = f(w5h1 + w6h2 + b3)#dj/dw5 = h1 * f' dj/dw6 = h2 * f'#dL/w5 = dL/j * dj/w5dl_w5 = dL_j * h1 * deriv_sigmoid(o1)dl_w6 = dL_j * h2 * deriv_sigmoid(o1)dl_b3 = dL_j * deriv_sigmoid(o1)#dl/h1 = dL/dj * dj/dh1 = da_j * w5dl_h1 = dL_j * self.w5 * deriv_sigmoid(o1)dl_h2 = dL_j * self.w6 * deriv_sigmoid(o1)#h1 = f(w1* x1 + w2 * x2 + b1)#h2 = f(w3 * x1 + w4 * x2 + b2)#dl/w1 = dl/j * dj/h1 * dh1/dw1dl_w1 = dL_j * dl_h1 * x[0] * deriv_sigmoid(h1)dl_w2 = dL_j * dl_h1 * x[1] * deriv_sigmoid(h1)dl_b1 = dL_j * dl_h1 * deriv_sigmoid(h1)dl_w3 = dL_j * dl_h2 * x[0] * deriv_sigmoid(h2)dl_w4 = dL_j * dl_h2 * x[1] * deriv_sigmoid(h2)dl_b2 = dL_j * dl_h2 * deriv_sigmoid(h2)#注: 因为b的求导都为1 所以直接更新为rate * b#4、 更新w, bself.w1 -= dl_w1 * learn_rate self.w2 -= dl_w2 * learn_rateself.w3 -= dl_w3 * learn_rateself.w4 -= dl_w4 * learn_rateself.w5 -= dl_w5 * learn_rateself.w6 -= dl_w6 * learn_rateself.b1 -= dl_b1 * learn_rateself.b2 -= dl_b2 * learn_rateself.b3 -= dl_b3 * learn_rateif i % 10 == 0:y_preds = np.apply_along_axis(self.feed_forward, 1, data)loss = loss_mse(y_labels, y_preds)print("Epoch %d loss: %.3f" % (i, loss))# def __str__(self):# pass# return 'weights\t:%s\nbias\t:%f\n' % (np.array([self.w1, self.w2, self.w3, self.w4, self.w5, self.w6]), np.array([self.b1, self.b2, self.b3]))neural = Neural()
neural.train(data, all_y_trues)
print(neural)
emily = np.array([-7, -3]) # 128 pounds, 63 inches
frank = np.array([20, 2]) # 155 pounds, 68 inches
print("Emily: %.3f" % neural.feed_forward(emily)) # 0.951 - F
print("Frank: %.3f" % neural.feed_forward(frank)) # 0.039 - M
关于 神经网络 的理解相关推荐
- Deep Learning论文笔记之(五)CNN卷积神经网络代码理解
Deep Learning论文笔记之(五)CNN卷积神经网络代码理解 zouxy09@qq.com http://blog.csdn.net/zouxy09 自己平时看了一些论文,但 ...
- 神经网络通俗理解和理解,卷积神经网络通俗理解
通俗易懂:彻底明白什么是神经网络 想象一个黑箱子,你给它输入(样本),它给你输出(实际输出),但是输出和你想要的结果有偏差,于是你事先告诉它你想要的结果(期望输出),它做一些调整(调整内部权值和阈值) ...
- 卷积神经网络可视化理解
文章目录 设计来源 可视化第一层卷积核 可视化第一层featuremap 底层特征可视化 隐层featuremap可视化 遮挡.扰动实验 Gradient Ascent.feature inversi ...
- 干货|神经网络及理解反向传播
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一.人工神经网络简述 下面开始说神经网络.注意,当我们说N层神经网 ...
- xml文件 卷积神经网络_理解卷积神经网络中的输入与输出形状(Keras实现)
即使我们从理论上理解了卷积神经网络,在实际进行将数据拟合到网络时,很多人仍然对其网络的输入和输出形状(shape)感到困惑.本文章将帮助你理解卷积神经网络的输入和输出形状. 让我们看看一个例子.CNN ...
- 图卷积神经网络(GCN)理解与tensorflow2.0代码实现
图(Graph),一般用 G=(V,E)G=(V,E)G=(V,E) 表示,这里的VVV是图中节点的集合,EEE 为边的集合,节点的个数用NNN表示.在一个图中,有三个比较重要的矩阵: 特征矩阵XXX ...
- 卷积神经网络架构理解
神经网络基础 神经网络属于优化类的数学模型.每个神经元接收到输入后,经过一些计算操作后输出一个特定的数值.这个数值经过一个激活函数(非线性的),产生这个神经元的最后输出.有很多激活函数,且绝大数已经在 ...
- 关于SOM(self-organized map)自组织特征映射神经网络的理解
som网络结构 对SOM进行理解,首先要明确它的定位. 首先它是神经网络的一种,那么就有属于神经网络共同的性质.比如输入层,输出层.刚好,SOM网络只有这两层. (上面两张是典型的som网络结构图) ...
- 人工神经网络与神经网络,对人工神经网络的理解
人工神经网络,人工神经网络是什么意思 . 一.人工神经网络的概念人工神经网络(ArtificialNeuralNetwork,ANN)简称神经网络(NN),是基于生物学中神经网络的基本原理,在理解和抽 ...
- 人工神经网络的算法原理,对人工神经网络的理解
什么是人工神经网络及其算法实现方式 人工神经网络(Artificial Neural Network,即ANN ),是20世纪80 年代以来人工智能领域兴起的研究热点. 它从信息处理角度对人脑神经元网 ...
最新文章
- 搜索引擎:文本分类——TF/IDF算法
- 简单的批处理命令(一)
- 新来的 不知道写什么呢
- Pandas简明教程:五、Pandas简单统计操作及通用方式
- 王道计算机考研 数据结构 (排序-上)
- python爬去百度搜索结果_python实现提取百度搜索结果的方法
- [js] 写一个方法遍历指定对象的所有属性
- 信噪比:高端科研级相机的核心参数
- Ubuntu安装完驱动后进不去界面
- 如何修复VUM在客户端启用之后报数据库连接失败的问题
- 2019小程序创业如何把握正确方向
- 义隆单片机可用c语言写了吗,义隆单片机编程时应注意的几点
- html把保留图片改为提交按钮,如何制作图片按钮,并为图片按钮添加提交表单和重置表单功能...
- 快速重装win10系统
- 如何在网格上绘画【UE4】
- 2020年10月12日斗鱼虎牙合并的瓜
- 免费cocos2dx3.x视频教程
- android护眼提醒,安卓手机上怎么设置定时提醒休息的护眼提醒?
- 如何实现简单计算器(附代码)
- Ubuntu下如何收听豆瓣电台
热门文章
- html 中几次方,平方米,立方米,上标,下标,删除线等的表示方法
- 因为这事,老王想杀人...
- php7.3.9 源码安装
- Python使用第三方库:openpyxl
- 非空判断方法:isNotEmpty和isNotBlank的区别
- qq修改实名认证已达上限_qq直播间怎么开直播?
- 关于Pytorch中dataset的迭代问题(这就是为什么我们要使用dataloader的原因之一)
- 折断线lisp_求一个方便实用的画CAD双折断线的程序
- Ubuntu 10.04与Win 7大比拼
- 【绝对干货】云虚拟主机网站无法访问的问题都在这里