MKL学习——向量操作

前言

推荐两个比较好的教程:

BLAS (Basic Linear Algebra Subprograms)

LAPACK for Windows

命名规范

BLAS基本线性代数子程序的函数命令都有一定规范,便于记忆

<character> <name> <mod> ()

character

定义的是数据类型

s实数域,单精度
c复数域,单精度
d实数域,双精度
z复数域,双精度

也可结合起来,比如sc代表实数域和复数域的单精度类型,dz代表实数域和复数域的双精度类型。

name

针对BLAS level 1,也就是向量与向量间的操作的时候

dot向量点乘
rot向量旋转
swap向量交换

针对BLAS level 2和3的情况,也就是矩阵参数类型

ge一般矩阵
gb一般带状矩阵
sy对称矩阵
sp对称矩阵(压缩存储)
sb对称带状矩阵
he埃尔米特矩阵 Hermitian matrix
hp埃尔米特矩阵(压缩存储)
hb埃尔米特带状矩阵
tr三角矩阵
tp三角矩阵(压缩存储)
tb三角带状矩阵

mod

提供操作的额外信息,三种Level情况

针对Level 1

c共轭向量
u非共轭向量
gGivens 旋转结构
m修正 Givens 旋转
mg修正 Givens 旋转结构

针对Level 2

mv矩阵-向量乘积
sv求解具有一个未知向量的线性方程组
r矩阵的一阶更新
r2矩阵的二阶更新

针对Level 3

mm矩阵-矩阵乘积
sm求解具有多个未知向量的线性方程组
rk矩阵的k阶更新
r2k矩阵的2k阶更新

函数实例

ddot 双精度、实数域,向量-向量点乘
cdotc复数域,向量-向量点乘,共轭
scasum巨型向量元素和,单精度实数域输出,单精度复数域输入
cdotu向量-向量点乘,一般矩阵,单精度
sgemv矩阵-向量点乘,一般矩阵,单精度
ztrmm矩阵-矩阵乘法,三角矩阵,双精度复数域

C接口的调用方法

C接口相对于Fortran有一个优势就是,可以指定是行优先还是列优先。调用方法就是在正常的命令规范前面加个前缀cblas_。对于复数函数?dotc?dotu还需要加一个后缀_sub,通过指针返回复数结果,作为后一个参数添加进来。

使用CALBAS需要遵循一些规则

  • 输入参数需要使用const修饰
  • 非复数标量输入参数直接使用值传递
  • 复数标量参数使用void指针传递
  • 矩阵参数使用地址传递
  • BLAS类型参数使用合适的枚举类型代替
  • Level 2和3中有一个CLABS_LAYOUT类型的额外参数,作为第一个输入参数。这个参数指定二维数组是行优先CblasRowMajor还是列优先CblasColMajor

定义的枚举类型:

enum CBLAS_LAYOUT {
CblasRowMajor=101, /* row-major arrays */
CblasColMajor=102}; /* column-major arrays */
enum CBLAS_TRANSPOSE {
CblasNoTrans=111, /* trans='N' */
CblasTrans=112, /* trans='T' */
CblasConjTrans=113}; /* trans='C' */
enum CBLAS_UPLO {
CblasUpper=121, /* uplo ='U' */
CblasLower=122}; /* uplo ='L' */
enum CBLAS_DIAG {
CblasNonUnit=131, /* diag ='N' */
CblasUnit=132}; /* diag ='U' */
enum CBLAS_SIDE {
CblasLeft=141, /* side ='L' */
CblasRight=142}; /* side ='R' */

矩阵存储方案

三种存储方案:

  • 全部存储:比如将矩阵A存储到二维数组a中,矩阵元素Aij以列优先的方式存储到a[i+jlda]中,或者以行优先的形式存储到a[j+ilda]中。这里的lda就是数组的引导维度。
  • 压缩存储:用于存储对称阵,埃尔米特矩阵,三角矩阵。对于列优先的布局,上三角和下三角按照列存储到一个一维数组;或者按照行优先的布局,上三角和下三角按行存储到一个一维数组中。
  • 带状存储:带状矩阵被压缩存储到一个二维数组中。对于列优先布局,矩阵的列被存储到对应的数组列中,矩阵对角部分被存储到数组的特殊行中。对于行优先的布局,矩阵的行被存储到对应数组的行中,矩阵对角部分被存储到数组的指定行中。

行优先与列优先

Fortran中以列优先的方式存储二维数组;在C中,需要数组为行优先的格式,这是C的约定。讲道理的话,这句话应该是这样写,但是官方文档给出的英文是
The BLAS routines follow the Fortran convention of storing two-dimensional arrays using column-major layout. When calling BLAS routines from C, remember that they require arrays to be in column-major format, not the row-major format that is the convention for C. Unless otherwise specified, the psuedo-code examples for the BLAS routines illustrate matrices stored using column-major layout.
这里却写着是按照列存储的。但是在Intel® Math Kernel Library Getting Started Tutorial: Using the Intel® Math Kernel Library for Matrix Multiplication中的实例却是这样
这里写图片描述
代码是
这里写图片描述
这个for循环明显是将一行一行的赋值,说明连续存储的单元是行中相邻的元素。但是后面的英文又是
The one-dimensional arrays in the exercises store the matrices by placing the elements of each column in successive cells of the arrays.
意思是联系中的以为数组是将每行列的元素放入到数组单元中。代码明明是每行的元素放入到其中。这到底是按行存储还是按列存储?两篇参考博客介绍行列存储的区别: 行优先和列优先的问题,矩阵存储的两种方式——行优先与列优先。个人感觉,姑且认为是按行存储的吧,毕竟代码是这样写的,虽然与文字不一致。如果有同学有何见解,希望在评论区讨论讨论^_^

Level 1所有函数

所有函数概览

函数名缺失部分描述
cblas_?asums, d, sc, dz向量和
cblas_?axpys, d, c, z标量-向量乘积
cblas_?copys, d, c, z拷贝向量
cblas_?dots,d点乘
cblas_?sdotsd,d双精度点乘
cblas_?dotcc,z共轭点乘
cblas_?dotuc,z非共轭点乘
cblas_?nrm2s,d,sc,dz向量2范数
cblas_?rots,d,cs,zd绕点旋转
cblas_?rotgs,d,c,z生成点的Givens旋转
cblas_?rotms,d点的修正Givens旋转
cblas_?rotmgs,d生成点的修正Givens旋转
cblas_?scals, d, c, z, cs, zd向量-标量乘法
cblas_?swaps, d, c, z向量-向量交换
cblas_i?amaxs, d, c, z绝对值最大元素位置
cblas_i?amins, d, c, z绝对值最小元素位置
cblas_?cabs1s,d辅助函数,计算单精度或者双精度复数的绝对值

cblas_?asum

  • 作用:计算向量元素和
  • 定义函数
float cblas_sasum (const MKL_INT n, const float *x, const MKL_INT incx);
float cblas_scasum (const MKL_INT n, const void *x, const MKL_INT incx);
double cblas_dasum (const MKL_INT n, const double *x, const MKL_INT incx);
double cblas_dzasum (const MKL_INT n, const void *x, const MKL_INT incx);
  • 运算

    计算实数向量的元素和,或者计算复数向量的实部以及虚部的和

    res=|Re(x1)|+|Im(x1)|+|Re(x2|+|Im(x2)|++|Re(xn)|+|Im(xn)|

  • 输入参数

    n : 向量的元素个数

    x : 数组,大小至少是(1+(n1)abs(incx))

    incx : 指定索引向量x的增量

  • 返回值:向量所有元素的和

cblas_?axpy

  • 作用 : 计算向量-标量的积,然后加到结果上
  • 定义函数
void cblas_saxpy (const MKL_INT n, const float a, const float *x, const MKL_INT incx, float *y, const MKL_INT incy);
void cblas_daxpy (const MKL_INT n, const double a, const double *x, const MKL_INT incx, double *y, const MKL_INT incy);
void cblas_caxpy (const MKL_INT n, const void *a, const void *x, const MKL_INT incx, void *y, const MKL_INT incy);
void cblas_zaxpy (const MKL_INT n, const void *a, const void *x, const MKL_INT incx, void *y, const MKL_INT incy);
  • 运算

向量与向量之间的操作

y:=ax+y

  • 输入参数

    n : 指定向量x,y的元素个数

    a : 标量a

    x : 数组,大小至少是(1+(n1)abs(incx))

    incx : 指定索引向量x的增量

    y : 数组,大小至少是(1+(n1)abs(incy))

    incy : 指定索引向量y的增量

  • 返回值 : 最终更新得到的向量y

cblas_?copy

  • 作用 : 拷贝一个向量到另一个向量

  • 定义函数

    void cblas_scopy (const MKL_INT n, const float *x, const MKL_INT incx, float *y, const MKL_INT incy);
    void cblas_dcopy (const MKL_INT n, const double *x, const MKL_INT incx, double *y, const MKL_INT incy);
    void cblas_ccopy (const MKL_INT n, const void *x, const MKL_INT incx, void *y, const MKL_INT incy);
    void cblas_zcopy (const MKL_INT n, const void *x, const MKL_INT incx, void *y, const MKL_INT incy);
  • 运算

    拷贝向量 y=x

  • 输入参数

    n : 指定向量x,y的元素个数

    x : 数组,大小至少是(1+(n1)abs(incx))

    incx : 指定索引向量x的增量

    y : 数组,大小至少是(1+(n1)abs(incy))

    incy : 指定索引向量y的增量

  • 返回值 : 当n是正数的时候,向量x的拷贝被返回,否则参数不变。

cblas_?dot

  • 作用 : 计算向量-向量的点乘

  • 定义函数

    float cblas_sdot (const MKL_INT n, const float *x, const MKL_INT incx, const float *y, const MKL_INT incy);
    double cblas_ddot (const MKL_INT n, const double *x, const MKL_INT incx, const double *y, const MKL_INT incy);
  • 运算 :

    res=i=1nxiyi

  • 输入参数

    n,x,incx,y,incy分别代表元素个数,数组x,数组x的索引增量,数组y,数组y的索引增量

  • 返回值 : 返回两个向量的点乘;如果n<0,返回0

cblas_?sdot

  • 作用 : 计算双精度向量-向量的点乘

  • 定义函数

    float cblas_sdsdot (const MKL_INT n, const float sb, const float *sx, const MKL_INT incx, const float *sy, const MKL_INT incy);
    double cblas_dsdot (const MKL_INT n, const float *sx, const MKL_INT incx, const float *sy, const MKL_INT incy);
  • 运算

    ?sdot计算的是两个双精度向量的内积(点积),中间结果的累积是双精度的,但是sdsdot返回的结果是单精度的,使用dsdot可以输出双精度的结果。其中sdsdot为点积结果加一个标量值sb

  • 输入参数

    n : 输入向量xy的维度

    sb : 内积的单精度缩放值(仅针对sdsdot)

    sx,sy : 数组,包含单精度输入向量

    incx,incy : 两个数组的索引增量

  • 返回值 : 当n为正的时候,返回两个数组的点乘(sdsdot结果加一个标量sb);若n0,对于sdsdot返回sb,对于dsdot返回0

cblas_?dotc

  • 作用 : 计算一个共轭向量与另一个向量的点积

  • 定义函数

    void cblas_cdotc_sub (const MKL_INT n, const void *x, const MKL_INT incx, const void *y, const MKL_INT incy, void *dotc);
    void cblas_zdotc_sub (const MKL_INT n, const void *x, const MKL_INT incx, const void *y, const MKL_INT incy, void *dotc);
  • 运算

    res=i=1nconjg(xi)yi

  • 输入参数

    n,x,incx,y,incy分别代表元素个数,数组x及其索引增量,数组y及其增量

  • 输出 : 如果n>0,输出共轭向量x与非共轭向量y的点乘,否则返回0

cblas_?dotu

  • 作用 : 计算复数域的向量-向量的点积

  • 定义函数

    void cblas_cdotu_sub (const MKL_INT n, const void *x, const MKL_INT incx, const void *y, const MKL_INT incy, void *dotu);
    void cblas_zdotu_sub (const MKL_INT n, const void *x, const MKL_INT incx, const void *y, const MKL_INT incy, void *dotu);
  • 运算

    res=i=1nxiyi

    其中xiyi分别是复数向量xy的元素

  • 输入参数 : 同上

  • 输出参数 : 如果n>0,返回点积,否则返回0

cblas_?nrm2

  • 作用 : 计算一个向量的欧几里得范数(Euclidean norm)

  • 定义函数

    float cblas_snrm2 (const MKL_INT n, const float *x, const MKL_INT incx);
    double cblas_dnrm2 (const MKL_INT n, const double *x, const MKL_INT incx);
    float cblas_scnrm2 (const MKL_INT n, const void *x, const MKL_INT incx);
    double cblas_dznrm2 (const MKL_INT n, const void *x, const MKL_INT incx);
  • 运算

    res=||x||

  • 输入参数 : 元素个数,数组,索引增量

  • 返回值 : 向量x的欧几里得范数

cblas_?rot

  • 作用 : 平面上绕点旋转

  • 定义函数

    void cblas_srot (const MKL_INT n, float *x, const MKL_INT incx, float *y, const MKL_INT incy, const float c, const float s);
    void cblas_drot (const MKL_INT n, double *x, const MKL_INT incx, double *y, const MKL_INT incy, const double c, const double s);
    void cblas_csrot (const MKL_INT n, void *x, const MKL_INT incx, void *y, const MKL_INT incy, const float c, const float s);
    void cblas_zdrot (const MKL_INT n, void *x, const MKL_INT incx, void *y, const MKL_INT incy, const double c, const double s);
  • 运算

    通俗写法

    [xi,yi]=[xi,yi][cssc]

    官方写法

    xi=cxi+syiyi=cyisxi

  • 输入参数 : 元素个数,两个向量,对应的索引增量,c,s表示所绕点的坐标标量

  • 输出参数 : x的每个元素被cx+sy代替,y的每个元素被cysx代替

cblas_?rotg

  • 作用 : 计算Givens旋转参数

  • 定义函数

    void cblas_srotg (float *a, float *b, float *c, float *s);
    void cblas_drotg (double *a, double *b, double *c, double *s);
    void cblas_crotg (void *a, const void *b, float *c, void *s);
    void cblas_zrotg (void *a, const void *b, double *c, void *s);
  • 运算

    给定一个点的笛卡尔(Cartesian)坐标(a,b),返回参数c,s,r,z对应Givens旋转,c,s对应的是酉阵(unitary matrix),类似于

    [cssc][ab]=[r0]

    参数z这样定义 : 如果|a|>|b|,那么z=s,否则如果c0,那么z=1c,否则z=1

  • 输入参数 : a,b分别提供点p的横x坐标和纵y坐标

  • 输出参数 : Givens的四个参数

cblas_?rotm

  • 作用 : 修正绕平面是一点的Givens旋转

  • 定义函数

    void cblas_srotm (const MKL_INT n, float *x, const MKL_INT incx, float *y, const MKL_INT incy, const float *param);
    void cblas_drotm (const MKL_INT n, double *x, const MKL_INT incx, double *y, const MKL_INT incy, const double *param);
  • 运算

    给定两个向量x,y,这些向量的每个元素都会被替代为

    [xiyi]=H[xiyi]

    其中i=1n,H是修正Givens旋转矩阵,值存储在parm[1]parm[4]

  • 输入参数

    n,x,incx,y,incy,分别表示元素个数,两个向量,对应增量索引

    param : 包含五个参数,param[0]代表切换标志,param[14]均包含h11,h12,h21,h22,分别对应数组H的成分,依据标识符,可以得到如下数组H

    flag=1.0:H=[h11h21h12h22]flag=0.0:H=[1.0h21h121.0]flag=1.0:H=[h111.01.0h22]flag=2.0:H=[1.00.00.01.0]

    后三种情况,矩阵H中的0.1,1.0,0.0可以由标志指定,无需在向量中写出来

  • 输出 : x的每一个向量被h11x[i]+h12y[i]替换,y的每一个向量被h21x[i]+h22y[i]替换

cblas_?rotmg

  • 作用 : 计算修正Givens旋转的参数

  • 定义函数

    void cblas_srotmg (float *d1, float *d2, float *x1, const float y1, float *param);
    void cblas_drotmg (double *d1, double *d2, double *x1, const double y1, double *param);
  • 运算

    给定输入向量的笛卡尔坐标(x1,y1),计算将结果向量的y置零时候,计算得到的Givens旋转矩阵H

    [x10]=H[x1d1y1d2]

  • 输入参数

    d1代表向量的x轴缩放因子,d2代表向量的y轴缩放因子,x1,y1是输入向量的横纵坐标

  • 输出

    d1是更新矩阵的第一对角元

    d2是更新矩阵的第二对角元

    x1是缩放之前旋转向量的x坐标

    param同上cblas_?rotmg的输入parma一样

cblas_?scal

  • 作用 : 计算向量和标量的乘积

  • 定义函数

    void cblas_sscal (const MKL_INT n, const float a, float *x, const MKL_INT incx);
    void cblas_dscal (const MKL_INT n, const double a, double *x, const MKL_INT incx);
    void cblas_cscal (const MKL_INT n, const void *a, void *x, const MKL_INT incx);
    void cblas_zscal (const MKL_INT n, const void *a, void *x, const MKL_INT incx);
    void cblas_csscal (const MKL_INT n, const float a, void *x, const MKL_INT incx);
    void cblas_zdscal (const MKL_INT n, const double a, void *x, const MKL_INT incx);
  • 运算

    x=ax

  • 输入参数

    n向量的元素个数,a标量,x数组,incx向量x的索引增量

  • 输出 : 更新后的向量x

cblas_?swap

  • 作用 : 交换向量值

  • 定义函数

    void cblas_sswap (const MKL_INT n, float *x, const MKL_INT incx, float *y, const MKL_INT incy);
    void cblas_dswap (const MKL_INT n, double *x, const MKL_INT incx, double *y, const MKL_INT incy);
    void cblas_cswap (const MKL_INT n, void *x, const MKL_INT incx, void *y, const MKL_INT incy);
    void cblas_zswap (const MKL_INT n, void *x, const MKL_INT incx, void *y, const MKL_INT incy);
  • 计算:交换向量xy,互相代替元素值

  • 输入参数 : 正常的五个输入,元素个数,数组,增量索引

  • 输出 : 交换后的向量x,y

cblas_i?amax

  • 作用 : 找到绝对值最大的元素的索引

  • 定义函数

    CBLAS_INDEX cblas_isamax (const MKL_INT n, const float *x, const MKL_INT incx);
    CBLAS_INDEX cblas_idamax (const MKL_INT n, const double *x, const MKL_INT incx);
    CBLAS_INDEX cblas_icamax (const MKL_INT n, const void *x, const MKL_INT incx);    
    CBLAS_INDEX cblas_izamax (const MKL_INT n, const void *x, const MKL_INT incx);
  • 计算 : 给定向量x,函数i?amax返回实数域中绝对值最大的向量元素x[i]的位置,或者返回复数域|Re(x[i])|+|Im(x[i])|和的最大值

    如果n非正,则返回

    如果向量中有好几个位置的值等于最大元素,第一个位置将被返回

  • 输入参数 : n,x,incx分别代表向量元素个数,数组,索引增量

  • 返回值 : 返回最大值元素的位置,比如x[index1]具有最大的绝对值

cblas_i?amin

  • 作用 : 返回最小值的位置

  • 定义函数

    CBLAS_INDEX cblas_isamin (const MKL_INT n, const float *x, const MKL_INT incx);
    CBLAS_INDEX cblas_idamin (const MKL_INT n, const double *x, const MKL_INT incx);
    CBLAS_INDEX cblas_icamin (const MKL_INT n, const void *x, const MKL_INT incx);
    CBLAS_INDEX cblas_izamin (const MKL_INT n, const void *x, const MKL_INT incx);
  • 计算 : i?amin返回的是向量的最小绝对值的位置。与i?amax类似

  • 输入参数: 同i?amax

  • 返回值: 绝对值最小元素位置的索引,比如x[index1]具有最小的绝对值

cblas_?cabs1

  • 作用: 计算复数的绝对值,是一个辅助函数,用于辅助其它函数的实现

  • 定义函数

    float cblas_scabs1 (const void *z);
    double cblas_dcabs1 (const void *z);
  • 计算

    res=|Re(z)|+|Im(z)|

  • 输入: 标量z

  • 返回值: 复数z的绝对值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【caffe-Windows】识别率批量输出——matlab实现

前言 今天看到群里有人问”用matlab输出测试集的精度“&#xff0c;瞎试了一下&#xff0c;好像还成功了。主要还是依据前面所有在matlab中操作caffe的博客。 这里说一下&#xff1a;classification.m是适用单张图片的精度&#xff0c;类似于classification.exe的功能&#x…

相机矩阵(Camera Matrix)

前言 最近翻阅关于从2D视频或者图片中重构3D姿态的文章及其源码&#xff0c;发现都有关于摄像机参数的求解&#xff0c;查找了相关资料&#xff0c;做一下笔记。 国际惯例&#xff0c;来一波参考网址 透视变换、透镜畸变及校正模型、相机校正(Camera Calibration)、Matlab相…

损失函数梯度对比-均方差和交叉熵

前言 我们都知道在机器学习中&#xff0c;希望算法或者网络收敛更快&#xff0c;有些是对数据预处理&#xff0c;尤其是Batch Normalization&#xff0c;有些是采用不同的激活函数&#xff0c;尤其是Relu激活函数取得了巨大的成功&#xff0c;还有一种加速收敛方法是更换损失函…

如何选择深度学习优化器

前言 转载地址&#xff1a;如何选择深度学习优化器 作者&#xff1a;不会停的蜗牛 CSDN AI专栏作家 在很多机器学习和深度学习的应用中&#xff0c;我们发现用的最多的优化器是 Adam&#xff0c;为什么呢&#xff1f; 下面是 TensorFlow 中的优化器&#xff0c; https://w…

【caffe-Windows】基于Python多标签方法——VOC2012数据集

前言 按照上一篇博客所遗留的话题&#xff1a;多标签分类&#xff0c;进行初步探索&#xff0c;此篇博客针对caffe官网的多分类进行配置&#xff0c;只不过是Python接口的&#xff0c;不过官网在开头说明可以使用HDF5或者LMDB进行操作&#xff0c;只不过Python更加方便罢了 国…

【theano-windows】学习笔记二——theano中的函数和共享参数

前言 上一篇博客中学到了theano中的变量类型&#xff0c;也就是dscalar、dvector之类的, 然后还有一个theano.function和eval函数, 将我们所定义的操作转换成theano可执行的函数&#xff0c;类似于def, 还有就是简单的线性代数运算操作。 在神经网络(NN)中, 我们声明了权重、…

【theano-windows】学习笔记三——theano中的导数

前言 就一个NN而言&#xff0c;包含梯度、偏置、参数更新&#xff0c;而前面第一篇博客学习了theano中符号变量的定义, 第二篇博客学习了变量的随机初始化, 变量之间的互相操作(类似于sigmoid(w∗xb)), 但是参数更新还应涉及到损失函数的偏导计算&#xff0c;这一章节就是看看…

【theano-windows】学习笔记五——theano中张量部分函数

前言 至此感觉应该可以写出一个logistic回归程序了&#xff0c;但是为了达到对theano中张量的更灵活的使用, 还是先看一下thenao.tensor对变量都提供了哪些操作&#xff0c;最全的文档戳这里或者这里, 这里就稍微摘取一点自我感觉以后可能用得多的函数 基本张量函数 创建张量…

【theano-windows】学习笔记六——theano中的循环函数scan

前言 Scan是Theano中最基础的循环函数, 官方教程主要是通过大量的例子来说明用法. 不过在学习的时候我比较习惯先看看用途, 然后是参数说明, 最后再是研究实例. 国际惯例, 参考网址 官网关于Scan的11个例子 官网更全面的介绍 简介 用途 递归的一般形式, 可以被用于循环s…

【theano-windows】学习笔记九——softmax手写数字分类

前言 上一篇博客折腾了数据集的预备知识, 接下来按照官方的Deep learning 0.1 documentation一步步走, 先折腾softmax, 关于softmax和logistic回归分类的联系, 我在之前写过一个小博客 国际惯例, 参考博客走一波: Classifying MNIST digits using Logistic Regression soft…

【theano-windows】学习笔记十——多层感知机手写数字分类

前言 上一篇学习了softmax, 然后更进一步就是学习一下基本的多层感知机(MLP)了. 其实多层感知机同时就是w*xb用某个激活函数激活一下, 得到的结果作为下一层神经元的输入x, 类似于 output⋯f3(f2(f1(x∗w1b2)∗w2b2)∗w3b3)⋯output=\cdots f^3(f^2(f^1(x*w^1+b^2)*w^2+b^2)*…

【theano-windows】学习笔记十一——theano中与神经网络相关函数

前言 经过softmax和MLP的学习, 我们发现thenao.tensor中除了之前的博客【theano-windows】学习笔记五——theano中张量部分函数提到的张量的定义和基本运算外, 还有一个方法称为nnet, 如果自己实现过前面两篇博客中的代码就会发现用到了theano.tensor.nnet.sigmoid和thenao.te…

【caffe-windows】全卷积网络特征图分析

前言 突然就想分析一下全卷积网络的转置卷积部分了, 就是这么猝不及防的想法, 而且这个网络对图片的输入大小无要求&#xff0c;这么神奇的网络是时候分析一波了&#xff0c;我个人的学习方法调试代码&#xff0c;然后对照论文看理论 本次分析主要针对每层的权重大小和特征图…

【theano-windows】学习笔记十二——卷积神经网络

前言 按照进度, 学习theano中的卷积操作 国际惯例, 来一波参考网址 Convolutional Neural Networks (LeNet) 卷积神经网络如何应用在彩色图像上&#xff1f; 卷积小知识 三大特性&#xff1a;局部感知(稀疏连接), 权值共享, 池化 上图很重要, 描述的是前一个隐层m-1具有四…

【theano-windows】学习笔记十三——去噪自编码器

前言 上一章节学习了卷积的写法,主要注意的是其实现在theano.tensor.nnet和theano.sandbox.cuda.dnn中都有对应函数实现, 这一节就进入到无监督或者称为半监督的网络构建中. 首先是自编码器(Autoencoders)和降噪自编码器(denoising Autoencoders) 国际惯例, 参考网址: Denoi…

【theano-windows】学习笔记十四——堆叠去噪自编码器

前言 前面已经学习了softmax,多层感知器,CNN&#xff0c;AE&#xff0c;dAE&#xff0c;接下来可以仿照多层感知器的方法去堆叠自编码器 国际惯例&#xff0c;参考文献&#xff1a; Stacked Denoising Autoencoders (SdA) Greedy Layer-Wise Training of Deep Networks 理…

【theano-windows】学习笔记十五——受限玻尔兹曼机

前言 终于到了最喜欢的模型: 受限玻尔兹曼机(RBM)了, 发现关于RBM是如何从能量模型发展过来的介绍非常不错, 而关于详细理论证明, 可以去看我前面的受限玻尔兹曼机的一系列博客. 国际惯例, 参考博客,超级强推第二个博客, 证明过程很给力: Restricted Boltzmann Machines (R…

【Ogre-windows】环境配置

前言 由于工程原因, 学习一下Ogre面向对象图形渲染开源引擎, 慢慢爬坑吧。首先还是环境的配置问题哎. 其实最重要的是要预先编译三方库, 虽然官方说可以自动编译, 但是在自己电脑上还是出现了无法解析外部符号之类的问题, 正常情况下我就认为是三方库的lib出现了问题, 最后额外…

【theano-windows】学习笔记十六——深度信念网络DBN

前言 前面学习了受限玻尔兹曼机(RBM)的理论和搭建方法, 如果稍微了解过的人, 肯定知道利用RBM可以堆叠构成深度信念网络(deep belief network, DBN)和深度玻尔兹曼机(deep Boltzmann machine), 这里就先学习一下DBN. 国际惯例, 参考博文: Deep Belief Networks A fast lear…

【Ogre-windows】实例配置

前言 折腾了好久才搞定教程实例, 主要是因为上一篇博客安装的具体版本是Ogre1.10.9, 而官方的Ogre Wiki Tutorial Framework没有指定具体版本, 如果单纯下载Ogre Wiki Tutorial Framework 1.10 - (Windows line endings, updated 2015-10-15) 运行, 基本会血崩. 所以, 在经过仔…