1.matlab中@的使用
@是用于定义函数句柄的操作符,传递返回的是函数句柄
还有另外一种用法
变量名=@(输入参数列表)运算表达式,下面有两个例子
%1
fn=@sin(x);
fn(x)=sin(x);
%2
fn=@(x,y) (x+y);
fn(1,1)
ans =
2
%3这个更复杂一点了,是对一个函数 sygetBatch做后处理,然后得到一个新的数据接口的函数句柄fn,输入是imdb和images
function fn=WrappersygetBatch(batopts)
fn=@(imdb,images) sygetBatch(imdb,images,batopts);
end
2.varargin,nargin
varargin用于函数输入参数不确定的情况,narin表示输入参数的个数(包含固定和不固定的输入),设定一个函数的输入如果是
f("name",val)的形式,那么这个输入其实是以结构体形式输入的。
3.和结构体相关的几个函数:
- fiednames 返回结构体的成员名称
- struct2cell以cell的形式取出结构体成员的值
4.matconvnet有关的笔记
- vl_argparse(opts,args)用于更新结构体的opts,而输入参数args的输入格式为args={'par1',val1,'par2',val2};前提是输入参数的结构体的成员应该要存在于opts结构体中
- cat用于concatenates: cat(dim,A,B),比如将3个灰度图片合成一个彩色图:cat(3,r,g,b);
- dagnnWrapper结构下的网络结构为
其中比较重要的是layers,vars,params,layers记录的是每一个层的名称,vars记录的是变量名(各个层的输入输出),params存储参数,包括卷积核的参数等。可以通过getvaridx/getlayeridx/getparamsidx获取索引,通过renameVar命令等类似的命令更改层,变量或者params的名称。
- unique函数返回的是唯一的值,C=unique(A),则返回的是A中的不重复的值,prod函数是针对矢量或者矩阵的乘法运算。fix取整。
- 使用DOT+graphVIZ画流程图
这是一个很好的画流程图的软件,特别适合画网络结构,而且可编程,具体的语言就是DOT语言,如果需要安装的画,直接去graphVIZ的官网下载,按照官网上的指示下载就好了。
softmax函数如下公式所示,这个函数一个很明显的好处是能够把网络最后一层的输出(N为输出的channel宽度,一般和种类同宽)映射到[0 1]的空间中,成为一个概率分布。
(下面是i!=m的情况)
交叉熵可用来度量两个概率分布之间的距离,是K-L散度的变形:
交叉熵(N为类别数,y为标注,比如3分类中的标注[0 1 0]、[0 0 1]等):pi为第i维的概率输出,交叉熵就是衡量标注的概率分布与实际输出的概率分布的差异。k代表第k类。
其实经过softmax+entropy计算之后,反传回去的梯度是在softmax计算输出的基础上,对目标对应的那一类的输出的一支减一,设目标属于a类,那么k=a的那一路输出,反传回去的梯度就是在原来的基础上减去1,其余分支不变:
6.vl-nnloss里面那个ci的计算含义图解(这个主要是给自己看的)