文章目录

  • 首语:
  • 感知机(神经元)
  • 神经网络的结构
    • 正向传播

首语:

-学了一个多月的机器学习,对于神经网络才刚刚接触,感知机的实现相对好理解,但神经网络的逻辑较为复杂,在这做一个总结和思考。希望能得到各位大佬的指正。

感知机(神经元)

适合做简单的分类或线性方程, 如判断是不是正数, 无法处理复杂的多维特征
实现:参考

关键的感知机的参数优化方法:
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

关于 神经网络 的理解相关推荐

  1. Deep Learning论文笔记之(五)CNN卷积神经网络代码理解

    Deep Learning论文笔记之(五)CNN卷积神经网络代码理解 zouxy09@qq.com http://blog.csdn.net/zouxy09          自己平时看了一些论文,但 ...

  2. 神经网络通俗理解和理解,卷积神经网络通俗理解

    通俗易懂:彻底明白什么是神经网络 想象一个黑箱子,你给它输入(样本),它给你输出(实际输出),但是输出和你想要的结果有偏差,于是你事先告诉它你想要的结果(期望输出),它做一些调整(调整内部权值和阈值) ...

  3. 卷积神经网络可视化理解

    文章目录 设计来源 可视化第一层卷积核 可视化第一层featuremap 底层特征可视化 隐层featuremap可视化 遮挡.扰动实验 Gradient Ascent.feature inversi ...

  4. 干货|神经网络及理解反向传播

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一.人工神经网络简述 下面开始说神经网络.注意,当我们说N层神经网 ...

  5. xml文件 卷积神经网络_理解卷积神经网络中的输入与输出形状(Keras实现)

    即使我们从理论上理解了卷积神经网络,在实际进行将数据拟合到网络时,很多人仍然对其网络的输入和输出形状(shape)感到困惑.本文章将帮助你理解卷积神经网络的输入和输出形状. 让我们看看一个例子.CNN ...

  6. 图卷积神经网络(GCN)理解与tensorflow2.0代码实现

    图(Graph),一般用 G=(V,E)G=(V,E)G=(V,E) 表示,这里的VVV是图中节点的集合,EEE 为边的集合,节点的个数用NNN表示.在一个图中,有三个比较重要的矩阵: 特征矩阵XXX ...

  7. 卷积神经网络架构理解

    神经网络基础 神经网络属于优化类的数学模型.每个神经元接收到输入后,经过一些计算操作后输出一个特定的数值.这个数值经过一个激活函数(非线性的),产生这个神经元的最后输出.有很多激活函数,且绝大数已经在 ...

  8. 关于SOM(self-organized map)自组织特征映射神经网络的理解

    som网络结构 对SOM进行理解,首先要明确它的定位. 首先它是神经网络的一种,那么就有属于神经网络共同的性质.比如输入层,输出层.刚好,SOM网络只有这两层. (上面两张是典型的som网络结构图) ...

  9. 人工神经网络与神经网络,对人工神经网络的理解

    人工神经网络,人工神经网络是什么意思 . 一.人工神经网络的概念人工神经网络(ArtificialNeuralNetwork,ANN)简称神经网络(NN),是基于生物学中神经网络的基本原理,在理解和抽 ...

  10. 人工神经网络的算法原理,对人工神经网络的理解

    什么是人工神经网络及其算法实现方式 人工神经网络(Artificial Neural Network,即ANN ),是20世纪80 年代以来人工智能领域兴起的研究热点. 它从信息处理角度对人脑神经元网 ...

最新文章

  1. 搜索引擎:文本分类——TF/IDF算法
  2. 简单的批处理命令(一)
  3. 新来的 不知道写什么呢
  4. Pandas简明教程:五、Pandas简单统计操作及通用方式
  5. 王道计算机考研 数据结构 (排序-上)
  6. python爬去百度搜索结果_python实现提取百度搜索结果的方法
  7. [js] 写一个方法遍历指定对象的所有属性
  8. 信噪比:高端科研级相机的核心参数
  9. Ubuntu安装完驱动后进不去界面
  10. 如何修复VUM在客户端启用之后报数据库连接失败的问题
  11. 2019小程序创业如何把握正确方向
  12. 义隆单片机可用c语言写了吗,义隆单片机编程时应注意的几点
  13. html把保留图片改为提交按钮,如何制作图片按钮,并为图片按钮添加提交表单和重置表单功能...
  14. 快速重装win10系统
  15. 如何在网格上绘画【UE4】
  16. 2020年10月12日斗鱼虎牙合并的瓜
  17. 免费cocos2dx3.x视频教程
  18. android护眼提醒,安卓手机上怎么设置定时提醒休息的护眼提醒?
  19. 如何实现简单计算器(附代码)
  20. Ubuntu下如何收听豆瓣电台

热门文章

  1. html 中几次方,平方米,立方米,上标,下标,删除线等的表示方法
  2. 因为这事,老王想杀人...
  3. php7.3.9 源码安装
  4. Python使用第三方库:openpyxl
  5. 非空判断方法:isNotEmpty和isNotBlank的区别
  6. qq修改实名认证已达上限_qq直播间怎么开直播?
  7. 关于Pytorch中dataset的迭代问题(这就是为什么我们要使用dataloader的原因之一)
  8. 折断线lisp_求一个方便实用的画CAD双折断线的程序
  9. Ubuntu 10.04与Win 7大比拼
  10. 【绝对干货】云虚拟主机网站无法访问的问题都在这里