前向传播、反向传播与感知器

设计思路

前向传播

前向传播是计算输出值 y ^ = W T x + b \hat y=W^Tx+b y^​=WTx+b与损失函数 L o s s ( y ^ , y ) Loss(\hat y,y) Loss(y^​,y)。具体而言就在神经网络中是根据输入的数据x与网络的权重w经过激活函数后输出 y ^ \hat y y^​,并根据 y ^ \hat y y^​与 y y y计算出损失函数的过程。

反向传播

方向传播是计算损失函数的梯度,即 Δ w = α ∂ L ∂ w \Delta w=\alpha\frac{\partial L}{\partial w} Δw=α∂w∂L​, Δ b = α ∂ L ∂ b \Delta b=\alpha\frac{\partial L}{\partial b} Δb=α∂b∂L​,$w = w - \Delta w , , ,b = b - \Delta b , 其 中 ,其中 ,其中\alpha$是学习率。根据微积分中的梯度方向是函数值增长方向的原理,通过向梯度方向的反方向更新权重与偏置,来使得损失函数的取值最小化的过程。

代码

以下采用简单的一元线性函数 y = w x + b y=wx+b y=wx+b进行实验,实现感知器。激活函数选择线性函数,损失函数采用平方误差函数 L o s s ( y ^ , y ) = ( y ^ − y ) 2 Loss(\hat y,y)=(\hat y-y)^2 Loss(y^​,y)=(y^​−y)2,平方误差函数对w的偏导数为 ∂ L ∂ w = 2 ( y ^ − y ) × x \frac{\partial L}{\partial w}=2(\hat y-y)\times x ∂w∂L​=2(y^​−y)×x,对b的偏导数为 ∂ L ∂ b = 2 ( y ^ − y ) \frac{\partial L}{\partial b}=2(\hat y-y) ∂b∂L​=2(y^​−y)。本段代码大约在30epoch后收敛。

Pure Python

import numpy as np# generate the data and add random noise
a = 3
b = 1
data_size = 1000
train_x = np.random.randn(1, data_size)
train_y = a * train_x + b + 0.1 * np.random.randn(1, data_size)class Network:def __init__(self, size, learning_rate):self.w = np.random.randn(size)self.b = np.random.randn(1)self.learning_rate = learning_ratedef y_hat(self, x):return np.dot(self.w, x)+self.bdef loss(self, x, y):return np.square(self.y_hat(x) - y)def update(self, x, y):gradient = 2*(self.y_hat(x) - y)self.w -= gradient*self.learning_rate*xself.b -= gradient*self.learning_ratedef train(self, x, y):for index in range(y.shape[1]):self.update(x[:,index], y[:,index])network = Network(1, 1e-4)valid_x = np.random.randn(1, data_size//3)
valid_y = a*valid_x + b + 0.1*np.random.randn(1, data_size//3)epoch = 30
for i in range(epoch):print("epoch:{}/{}".format(i,epoch))network.train(train_x, train_y)print("w:{},b:{},train_loss:{},valid_loss:{}".format(network.w, network.b,np.sum(network.loss(train_x, train_y))/data_size,np.sum(network.loss(valid_x, valid_y))/(data_size//3)))

mindspore

参考简单线性函数拟合。

import numpy as np
import matplotlib.pyplot as plt
from mindspore import dataset as ds
from mindspore import nn
from mindspore import Tensor
from mindspore import Modeldef generate_data(data_size, w=3.0, b=1.0):for _ in range(data_size):x = np.random.randn(1)y = w * x + b + 0.1 * np.random.randn(1)yield np.array([x]).astype(np.float32), np.array([y]).astype(np.float32)def create_dataset(data_size, batch_size=16, repeat_size=1):input_data = ds.GeneratorDataset(list(generate_data(data_size)), column_names=['data', 'label'])input_data = input_data.batch(batch_size)input_data = input_data.repeat(repeat_size)return input_datadef model_display(net):model_params = net.trainable_params()for param in model_params:print(param, param.asnumpy())x_model_label = np.array([-10, 10, 0.1])y_model_label = (x_model_label * Tensor(model_params[0]).asnumpy()[0][0] +Tensor(model_params[1]).asnumpy()[0])x_label, y_label = zip(*generate_data(data_number))plt.axis([-10, 10, -20, 25])plt.scatter(x_label, y_label, color="red", s=5)plt.plot(x_model_label, y_model_label, color="blue")plt.show()class LinearNet(nn.Cell):def __init__(self):super(LinearNet, self).__init__()self.fc = nn.Dense(1, 1)def construct(self, x):x = self.fc(x)return xdata_number = 100
batch_number = 16
repeat_number = 1ds_train = create_dataset(data_number, batch_size=batch_number, repeat_size=repeat_number)net = LinearNet()
model_display(net)
net_loss = nn.loss.MSELoss()
opt = nn.Momentum(net.trainable_params(), learning_rate=0.005, momentum=0.9)model = Model(net, net_loss, opt)
epoch = 10
model.train(epoch, ds_train, dataset_sink_mode=False)for net_param in net.trainable_params():print(net_param, net_param.asnumpy())model_display(net)

前向传播、反向传播与感知器相关推荐

  1. meanpool maxpool 前向和反向传播

    mean max 前向和反向传播 感觉平均迟化对值不太公平,应该加个权重,让算法自动去决定哪个 cnn中关于平均池化和最大池化的理解 接触到pooling主要是在用于图像处理的卷积神经网络中,但随着深 ...

  2. 4.6 前向和反向传播-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 4.5 搭建深层神经网络快 回到目录 4.7 参数 vs. 超参数 前向和反向传播 (Forward and Backward Propagation) 之前我们学习了构成深 ...

  3. Pytorch 自定义激活函数前向与反向传播 Tanh

    看完这篇,你基本上可以自定义前向与反向传播,可以自己定义自己的算子 文章目录 Tanh 公式 求导过程 优点: 缺点: 自定义Tanh 与Torch定义的比较 可视化 import matplotli ...

  4. 卷积神经网络前向及反向传播过程数学解析

    卷积神经网络前向及反向传播过程数学解析 文章目录 <center>卷积神经网络前向及反向传播过程数学解析 1.卷积神经网络初印象 2.卷积神经网络性质 3.前向传播 3.1.卷积层层级间传 ...

  5. 神经网络的前向和反向传播

    1.前向传播 前向传播的作用就是为了获取误差损失:现在以示例来说明: 上图是一个典型的神经网络结构,包括了输入层.隐含层和输出层,为了更好的讲解,现在对其进行赋值: 目标:给出输入数据i1,i2(0. ...

  6. numpy实现简单的二层网络------前向和反向传播

    会推导神经网络的前向和反向传播是深度学习的基础,也许大家在实验使用Tensorflow框架,只需要调用某一个损失函数,传入参数就可以得到损失,或者Mxnet框架,你都不需要调用任何函数,给个标志就可以 ...

  7. Pytorch 自定义激活函数前向与反向传播 sigmoid

    文章目录 Sigmoid 公式 求导过程 优点: 缺点: 自定义Sigmoid 与Torch定义的比较 可视化 import matplotlib import matplotlib.pyplot a ...

  8. 007-卷积神经网络03-前向传播-反向传播

    前向传播: 前向传播就是求特征图的过程 通常x和w有四个维度[编号,深度,高度,宽度] 反向传播: 先来复习一下反向传播的知识: 反向传播回来的是梯度,也就是偏导数 反向传播力有一个链式法则:对于反向 ...

  9. 深度学习-正向传播反向传播

    正向传播 对于神经元来说,训练的目标就是确认最优的w和b,使得输出值和真实值之间的误差变得最小. 数据从输入到输出,一层一层的进行运算,在输出层输出一个预测值y (理解:正向传播,多个输入层-> ...

  10. Pytorch 自定义激活函数前向与反向传播 ReLu系列 含优点与缺点

    文章目录 ReLu 公式 求导过程 优点: 缺点: 自定义ReLu 与Torch定义的比较 可视化 Leaky ReLu PReLu 公式 求导过程 优点: 缺点: 自定义LeakyReLu 与Tor ...

最新文章

  1. telnet 如何退出
  2. RDKit | 可视化分子来自于xyz文件
  3. ARM7还是ARM9?uCOS还是Linux?
  4. Ubuntu中启用关闭Network-manager网络设置问题!
  5. Fragment 与 Fragment 相互传值
  6. 全文搜索!收藏这篇Solr ElasticSearch 长文就可以搞定
  7. @bzoj - 2388@ 旅行规划
  8. Python打包 pyinstaller
  9. 每周荐书:MyBatis、并行编程、Ansible(评论送书)
  10. GNS3使用二:通过ASDM管理ASA防火墙
  11. 为什么快捷指令无法将媒体转换为文本_刘星文:快捷指令这个神器,让你的 iPhone 好用到飞起...
  12. win7磁盘合并步骤
  13. 神经元结构示意图讲解图,神经元的结构示意图
  14. Installation failed due to: ‘‘cmd package install-create -r -t --user current --full --dont-kill -t
  15. PayPay migrated the core payment database from Aurora to TiDB
  16. 尘埃落定性描写细节摘要_解释“细节”和“摘要”元素
  17. c语言余一个负数_C语言负数的除法和求余运算
  18. Thinkphp如何制作一个PC网站和移动端网站
  19. 往事如烟 - 潜先生
  20. 关于ip地址(转载)

热门文章

  1. msl3等级烘烤时间_J-STD-020, Moisture Sensitivity Levels(MSL)濕度敏感等級分類解說
  2. 星愿浏览器的安装与介绍
  3. javaweb html和css基础知识
  4. JQuery制作图书简介页面
  5. 行优先和列优先存储高维数组
  6. 使用 JSONP、jQuery 和 Yahoo! 查询语言构建 mashup
  7. 基于Android网上相亲交友婚恋app软件设计
  8. 『面试知识集锦100篇』2.linux篇丨shell基础命令全集,我奶奶的速查手册!!
  9. 实现人工神经网络ANN对医疗数据分类
  10. C 语言之一维数组(详细版)