delta函数

用numpy实现CNN卷积神经网络

我是研究僧i 提交于 2019-12-02 03:47:24
为了加深对卷积神经网络底层原理的理解,本文通过使用numpy来搭建一个基础的包含卷积层、池化层、全连接层和Softmax层的卷积神经网络,并选择relu作为我们的激活函数,选择多分类交叉熵损失函数,最后使用了mnist数据集进行了训练和测试。 关于卷积网络的详细原理和实现可参考下列文章: 刘建平Pinard:卷积网络前向反向传播算法 卷积层的反向传播 手把手带你 Numpy实现CNN 1、卷积层 卷积层的前向传播输出由卷积核和特征图作卷积运算得到,反向传播时需要计算kernel和bias的梯度以及delta的反向传播误差,kernel的梯度由原特征图和delta作卷积得到,bias每个通道的梯度由对delta每个通道直接求和得到,delta的反向传播误差由delta和旋转180度的卷积核作卷积运算得到。其中卷积运算在实现时先将特征图的对应部分和卷积核展开成了向量的形式,再作向量乘法运算,这样可以通过并行运算加快速度,实现代码如下: def img2col(x, ksize, stride): wx, hx, cx = x.shape # [width,height,channel] feature_w = (wx - ksize) // stride + 1 # 返回的特征图尺寸 image_col = np.zeros((feature_w*feature_w, ksize

导数,方向导数,梯度(Gradient)与梯度下降法(Gradient Descent)的介绍(非原创)

早过忘川 提交于 2019-12-01 02:48:59
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原作者:WangBo_NLPR 原文:https://blog.csdn.net/walilk/article/details/50978864 原作者:Eric_LH 原文:https://blog.csdn.net/eric_lh/article/details/78994461 --------------------- 前言  机器学习中的大部分问题都是优化问题,而绝大部分优化问题都可以使用梯度下降法处理,那么搞懂什么是梯度,什么是梯度下降法就非常重要!这是基础中的基础,也是必须掌握的概念!  提到梯度,就必须从导数(derivative)、偏导数(partial derivative)和方向导数(directional derivative)讲起,弄清楚这些概念,才能够正确理解为什么在优化问题中使用梯度下降法来优化目标函数,并熟练掌握梯度下降法(Gradient Descent)。  本文主要记录我在学习机器学习过程中对梯度概念复习的笔记,主要参考《高等数学》《简明微积分》以及维基百科上的资料为主,文章小节安排如下:  1)导数  2)导数和偏导数  3)导数与方向导数  4)导数与梯度  5)梯度下降法 导数  一张图读懂导数与微分:    这是高数中的一张经典图

cf2c(模拟退火 步长控制

梦想与她 提交于 2019-11-29 13:40:01
https://www.luogu.org/problem/CF2C 题意:在平面上有三个没有公共部分的圆,求平面上一点使得到三个圆的切线的夹角相等。(若没答案满足条件,则不打印 思路:可用模拟退火算法来枚举答案点,可过,然而应该不是正解。先设一个最优解和初始步长,然后以当前步长不断搜索最优解更新答案,若答案不能更新,则步长减半再搜索,直到精度达到要求结束算法。 #include<cstdio> #include<cmath> const double EPS=1E-5; //控制精度 struct Point { double x,y; double r; }P[3]; double Get(double x,double y,const Point b) { //求两点之间的距离 return sqrt((x-b.x)*(x-b.x)+(y-b.y)*(y-b.y)); } double Check(double x,double y) { //估价函数 double t[3],delta[3],ret=0.0; //t为当前视角,delta表示误差值 for(int i=0;i<3;++i) t[i]=Get(x,y,P[i])/P[i].r; for(int i=0;i<3;++i) { delta[i]=t[i]-t[(i+1)%3]; ret+=delta[i]

灰度图像的频率域滤波——高斯(Gaussian)低通滤波器(Matlab)

人盡茶涼 提交于 2019-11-29 04:59:35
clc; clear all; close all; %读入图像,并转换为double型 I=imread('D:\Gray Files\4-41.tif'); I_D=im2double(I); %获得图像的高度和宽度 [M,N]=size(I_D); %图像中心点 M0=M/2; N0=N/2; J=fft2(I_D); J_shift=fftshift(J); %%%%===================高斯(Gaussian)低通滤波器========================== %截至频率距离圆点的距离,delta表示高斯曲线的扩散程度 D0=80; delta=D0; for x=1:M for y=1:N %计算点(x,y)到中心点的距离 d2=(x-M0)^2+(y-N0)^2; %计算高斯滤波器 h=exp(-d2/(2*delta^2)); %用滤波器乘以主函数 J_shift(x,y)=J_shift(x,y)*h; end end J=ifftshift(J_shift); I_D_rep=ifft2(J); imshow(I_D_rep,[]); 来源: https://blog.csdn.net/lengo/article/details/100527527

灰度共生矩阵(Gray-level Co-occurrence Matrix,GLCM),矩阵的特征量

心不动则不痛 提交于 2019-11-28 22:47:13
又叫做灰度共现矩阵 Prerequisites 概念 计算方式 对于精度要求高且纹理细密的纹理分布,我们取像素间距为 d = 1 d=1,以下是方向的说明: 我们来看,matlab内置工具箱中的灰度共生矩阵的生成函数graycomatrix(gray-level co-occurrence matrix)对方向的说明: 如上图所示,方向是在每一个像素点(pixel of interest)的邻域(当然,边界点除外)中获得的,只不过这里的坐标系变为了: δ = ( 0 , ± 1 ) δ=(0,±1)为水平方向扫描,也即 θ = 0 ∘ o r θ = 180 ∘ θ=0∘orθ=180∘; δ = ( ± 1 , 0 ) δ=(±1,0)为垂直扫描( θ = 90 ∘ o r θ = − 90 ∘ θ=90∘orθ=−90∘); δ = ( 1 , − 1 ) , δ = ( − 1 , 1 ) δ=(1,−1),δ=(−1,1)是 − 45 ∘ −45∘或 135 ∘ 135∘扫描; δ = ( 1 , 1 ) , δ = ( − 1 , − 1 ) δ=(1,1),δ=(−1,−1)是 45 ∘ 45∘扫描。 一旦像素间距离 d d以及像素间空间位置关系 δ δ确定,即可生成灰度共生矩阵。 GLCM所表示的是纹理图像的某些统计特性,所谓统计,通俗地讲就是累计某种情况出现的次数

反向传播算法简介

我怕爱的太早我们不能终老 提交于 2019-11-28 13:28:52
反向传播算法 参考: http://neuralnetworksanddeeplearning.com/chap2.html BP 算法所关注的是损失函数 C 关于神经网络每一个权重 w 和偏置 b 的偏导。BP 算法向我们展示权值和偏置对损失值的影响。BP 不仅仅是一个快速的算法,其同时为我们提供了一个视角,让我们观察权值和偏置是如何影响网络输出的。 热身:使用矩阵计算网络输出 先介绍一个网络权重和偏置值的数学表示:$w_{jk}^l$,左侧的数学表达式表示第 $l$ 层网络的第 $j$ 个元素和第 $l-1$ 层第 $k$ 个元素之间的权重。同样的,$b_j^l$ 表示第 $l$ 层第$j$个元素的偏置值,$a_j^l$ 表示 $l$ 层第 $j$ 个元素的激活函数输出。利用这种数学表示,$a_j^l$ 可以表示为: $$ a_j^l = \sigma(\sum_k w_{jk}^l a_k^{l-1} + b_j^l) \tag{1} $$ 使用矩阵形式表示上述表达式: $$ a^l = \sigma(w^l a^{l-1} + b^l) \tag{2} $$ 定义 $z^l = w^l a^{l-1} + b^l$ 为激活函数的输入值则可以将上面表达式$(2)$ 表示为: $$ a^l = \sigma(z^l) \tag{3} $$ 损失函数的两个要求 BP

微分起源

被刻印的时光 ゝ 提交于 2019-11-27 10:19:01
http://www.baike.com/wiki/%E5%BE%AE%E5%88%86 http://www.cnblogs.com/hustlzp/archive/2011/09/11/the-framework-of-the-calculus.html 以直代曲,以切线代曲线。 1. 微分由求给定曲线在给定点的切线问题开始的,求切线就是求导,就是得到Δy/Δx的极端值, 算出这个商的最终比。这个最开始研究的时候需要一点点计算出来,首先需要估计出Δy的值,Δy=f(x0+Δx)-f(x0) 要得到Δy/Δx的极端值,假设它有值,值等于A,那么Δy长什么样呢? Δy≈A×Δx,Δy=A×Δx+ο(Δx), ο(Δx)=Δy-A×Δxο(Δx),ο(Δx)大小怎么样呢?它应该是相对于Δy忽略不计的小,很小。伴随着Δx,Δy越来越小,ο(Δx)应该是越来越可以忽略掉了。 ο(Δx)是相比Δx的无穷小量,二者的比值ο(Δx)/Δx会无限接近0,而不是一个绝对值大于0的数,比如ο(Δx)是这样的(Δx)², (Δx)³, ln(Δx), 最精彩的地方是我们把ο(Δx)去掉,正如y=x²,在x=2处的切线,Δx=0.000000000000000001, Δy=4Δx+(Δx)²=0.000000000000000004000000000000000001≈0

Chapter 2. 反向传播

旧时模样 提交于 2019-11-27 05:10:34
前言 BP算法最初在1970年代被提及,主要用于快速计算 代价函数 的 梯度,其核心是代价函数 C C C 关于任意权重 w w w (或偏置 b b b )的偏导数 ∂ C ∂ w \frac {\partial C}{\partial w} ∂ w ∂ C ​ 的表达式,通过改变权重和偏置,从而评估代价函数变化的快慢。 2.1 神经网络中使用矩阵快速计算输出的方法 权重 用 w j k l w_{j_k}^l w j k ​ l ​ 表示从 ( l − 1 ) t h (l-1)^{th} ( l − 1 ) t h 层的 k t h k^{th} k t h 个神经元到 l t h l^{th} l t h 层的 j t h j^{th} j t h 个神经元的连接上的权重。 用 b j l b_j^l b j l ​ 表示在 l t h l^{th} l t h 层第 j t h j^{th} j t h 个神经元的偏置,使用 a j l a^l_j a j l ​ 表示 l t h l^{th} l t h 层第 j t h j^{th} j t h 个神经元的激活值。从而变可以对 l t h l^{th} l t h 层的第 j t h j^{th} j t h 个神经元的激活值 a j l a^l_j a j l ​ 和 ( l − 1 ) t h (l-1)^{th