softmax理论及代码解读——UFLDL

前言

看了各种softmax以后迷迷糊糊的,还是研究一下UFLDL的教程稳点。当然还是得参考挺多教程的:UFLDL-softmax 、Softmax的理解与应用 、Logistic 分类器与 softmax分类器 、详解softmax函数以及相关求导过程 、Exercise:Softmax Regression 。
【UFLDL】网址有所变动:戳这里

其实,在最初比较疑惑的问题是:softmax的回归和分类到底是不是一个解法,或者它俩是不是一个知识?然后在一些博客中发现,softmax有时候也称为softmax分类回归器,而且在机器学习的定义中,回归问题通常用来预测一个值,如预测房价或者未来的天气状况等;分类用于将事物打上一个标签,通常结果为离散值,但是分类通常建立在回归上的,最常见的分类方法是逻辑回归或者叫逻辑分类。详细请戳回归(regression)与分类(classification)的区别

还是将logistic回归和softmax回归放一起看看。

Logistic回归

需要注意的是,logistic回归的中文叫做对数回归 ,我们经常也称他为逻辑回归

广义线性模型

上面说了分类通常建立在回归中,那么这个“建立”方法是什么?周志华老师《机器学习》给出了一个答案说的非常好:“只需要找一个单调可微函数将分类任务的真实标记与线性回归模型的预测值联系起来,上公式
y=g−1(wTx+b)y=g^{-1}(\mathbf w^T\mathbf x+b) y=g1(wTx+b)
这样得到的一个模型yyy称为"广义线性模型(generalized linear model)",其中g(⋅)g{(\cdot)}g()是单调可微函数,称为联系函数(link function)。对数广义函数g(⋅)=ln(⋅)g{(\cdot)=ln{(\cdot)}}g()=ln()是广义线性函数的一个特例

logistic回归(对数回归)

出现原因是,在二分类问题中,线性预测z=wTx+bz=\mathbf w^T\mathbf x+bz=wTx+b的输出值zzz为实值,转换为二分类最理想的方法是使用阶跃函数
y={0,z<00.5,z=01,z>0y=\begin{cases} 0,\quad z<0\\ 0.5,\quad z=0\\ 1,\quad z>0 \end{cases} y=0,z<00.5,z=01,z>0
但是阶跃函数明显是不可导的,需要采用近似的函数代替,这样对数几率函数就出现了(logistic function)
y=11+e−zy=\frac{1}{1+e^{-z}} y=1+ez1
它与我们经常说的sigmoid函数一样。带入到广义线性模型中就得到了对数回归(logistic regression),说是回归,其实是分类,而且对数回归的函数也经常被当做样本x\mathbf xx类别为1的概率:
P(y=1∣x;w,b)=hθ(x)=11+e−(wTx+b)P(y=1|\mathbf x;\mathbf w,b)=h_\theta(\mathbf x)=\frac{1}{1+e^{-(\mathbf w^T\mathbf x+b)}} P(y=1x;w,b)=hθ(x)=1+e(wTx+b)1
而且这个函数上下同时乘以e(wTx+b)e^{(w^Tx+b)}e(wTx+b)就能够变形成
P(y=1∣x;w,b)=e(wTx+b)1+e(wTx+b)P(y=1|\mathbf x;\mathbf w,b)=\frac{e^{(\mathbf w^T\mathbf x+b)}}{1+e^{(\mathbf w^T\mathbf x+b)}} P(y=1x;w,b)=1+e(wTx+b)e(wTx+b)
据此,在UFLDL中定义了对数回归的损失函数
J(θ)=−1m[∑i=1my(i)log⁡hθ(x(i))+(1−y(i))log⁡(1−hθ(x(i)))]J(\theta)=-\frac{1}{m}\left[\sum_{i=1}^m y^{(i)}\log h_\theta(x^{(i)})+(1-y^{(i)})\log (1-h_\theta(x^{(i)})) \right] J(θ)=m1[i=1my(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))]
更逼格一点的写法是
J(θ)=−1m[∑i=1m∑j=011{y(i)=j}log⁡P(y(i)=j∣x(i);θ)]J(\theta)=-\frac{1}{m}\left[\sum_{i=1}^m\sum_{j=0}^11\{y^{(i)}=j\}\log P(y^{(i)}=j|x^{(i)};\theta) \right] J(θ)=m1[i=1mj=011{y(i)=j}logP(y(i)=jx(i);θ)]
式中的1{⋅}1\{\cdot\}1{}称为示性函数,大括号里面的值为真的时候表达式值取1,反之取0;其中iii表示第几个样本,样本总数为mmm ,因为是有监督训练训练更新嘛,那么y(i)y^{(i)}y(i)就是指第iii个样本的标签了,由于是二分类问题,所以y(i)∈{0,1}y^{(i)}\in\{0,1\}y(i){0,1} ,更新办法就是直接用梯度更新就OK了。

Softmax 回归

梯度求解

由于softmax就是将简单的二分类扩充为多分类, 所以只需要对logistic回归代价函数中的两类问题改为多分类即可,改法就是观察logistic回归逼格写法中的第二个累加和的范围是从0到1,那么多分类就是从0到类别总数了,这样就可以得到softmax的代价函数
J(θ)=−1m[∑i=1m∑j=1k1{y(i)=j}log⁡P(y(i)=j∣x(i);θ)]J(\theta)=-\frac{1}{m}\left[\sum_{i=1}^m\sum_{j=1}^k1\{y^{(i)}=j\}\log P(y^{(i)}=j|x^{(i)};\theta) \right] J(θ)=m1[i=1mj=1k1{y(i)=j}logP(y(i)=jx(i);θ)]
由于softmax 输出的是对每一个类别估算的概率值,为了保证概率和为1,需要进行归一化,所以条件概率函数,也就是知道样本输入和模型参数的时候,这个样本属于各个标签的概率为:
P(y(i)=l∣x(i);θ)=eθlTx(i)∑j=1keθjTx(i)P(y^{(i)}=l|x^{(i)};\theta)=\frac{e^{\theta_l^Tx^{(i)}}}{\sum_{j=1}^ke^{\theta_j^Tx^{(i)}}} P(y(i)=lx(i);θ)=j=1keθjTx(i)eθlTx(i)
需要注意的是,这里的θ\thetaθ代表全部模型参数,大小是k∗(n+1)k*(n+1)k(n+1)
θ=[θ1T,θ2T,⋯,θkT]T\theta=\left[\theta_1^T,\theta_2^T,\cdots,\theta_k^T \right]^T θ=[θ1T,θ2T,,θkT]T
其实这样一看,就感觉应该是每一个类别都有一组模型参数,而每一组模型参数大小就是输入维度或者权重维度nnn再加上偏置的维度1,跟简单的神经网络连接方法一样,右边的每一个标签输出与左边的输入都有权重连接。

然后便可以得到softmax更具体的代价函数
J(θ)=−1m[∑i=1m∑j=1k1{y(i)=j}log⁡eθlTx(i)∑j=1keθjTx(i)]J(\theta)=-\frac{1}{m}\left[\sum_{i=1}^m\sum_{j=1}^k1\{y^{(i)}=j\}\log \frac{e^{\theta_l^Tx^{(i)}}}{\sum_{j=1}^ke^{\theta_j^Tx^{(i)}}}\right] J(θ)=m1[i=1mj=1k1{y(i)=j}logj=1keθjTx(i)eθlTx(i)]
插曲:上式是多类分类情况,如果利用sigmoid激活到(0,1)范围,获得最后一层值,如果改成多标签分类的表达式就是:
loss=∑j=1m∑i=1n−yjilog(yji^)−(1−yji)log(1−yji^)loss=\sum_{j=1}^m\sum_{i=1}^n−y_{ji}log(\hat{y_{ji}})−(1−y_{ji})log(1−\hat{y_{ji}}) loss=j=1mi=1nyjilog(yji^)(1yji)log(1yji^)
其中y(i)y^{(i)}y(i)是真实标签,P(y(i))P(y^{(i)})P(y(i))是预测输出的概率,通常为经过sigmoid激活函数归一化到(0,1)后的值。
关于多标签分类与单标签分类的区别,戳这里

直接令其对权重或者偏置的偏导数为零并不能求出闭式解(解析解),解析解就是有严格的公式可以直接根据输入得到输出,就像一元二次方程一样,有确定的求解公式,这一点可以参考百度百科。那么也就只能找近似解了,称为数值解,采用逼近的方法求解,一般就是梯度下降法或者变种方法了。

说到这个梯度,可以参考Softmax公式推导 ,或者看看本渣的推导,可能比他那个简单,但正确与否谢谢大家指正。

求导的时候主要注意一点,是针对某一个类别输出求导,也就是说对应k个θ\thetaθ 中的一个,所以在对某个权重求解偏导∂J(θ)θl\frac{\partial J(\theta)}{\theta_l}θlJ(θ)的时候可以直接对大括号后面一部分求导,即
∂log⁡eθlTx(i)∑j=1keθj⋅x(i)∂θl=∑j=1keθj⋅x(i)eθlTx(i)⋅∂eθlTx(i)∑j=1keθj⋅x(i)∂θl=∑j=1keθj⋅x(i)eθlTx(i)⋅eθlTx(i)⋅x(i)⋅∑j=1keθj⋅x(i)−eθlTx(i)⋅eθlTx(i)⋅x(i)(∑j=1keθj⋅x(i))2=x(i)⋅(∑j=1keθj⋅x(i)−eθlTx(i))∑j=1keθj⋅x(i)=x(i)⋅(1−P(y(l)=1∣x(i),k,θ))\begin{aligned} &\frac{\partial\log \frac{e^{\theta^T_lx^{(i)}}}{\sum_{j=1}^k e^{\theta_j \cdot x^{(i)}}}}{\partial \theta_l}\\ =& \frac{\sum_{j=1}^k e^{\theta_j \cdot x^{(i)}}}{e^{\theta^T_lx^{(i)}}}\cdot\frac{\partial\frac{e^{\theta^T_lx^{(i)}}}{\sum_{j=1}^k e^{\theta_j \cdot x^{(i)}}}}{\partial\theta_l}\\ =& \frac{\sum_{j=1}^k e^{\theta_j \cdot x^{(i)}}}{e^{\theta^T_lx^{(i)}}}\cdot\frac{e^{\theta^T_lx^{(i)}}\cdot x^{(i)}\cdot \sum_{j=1}^k e^{\theta_j \cdot x^{(i)}}-e^{\theta_l^Tx^{(i)}}\cdot e^{\theta_l^Tx^{(i)}}\cdot x^{(i)}}{(\sum_{j=1}^k e^{\theta_j \cdot x^{(i)}})^2}\\ =&\frac{x^{(i)}\cdot(\sum_{j=1}^k e^{\theta_j \cdot x^{(i)}}-e^{\theta_l^Tx^{(i)}})}{\sum_{j=1}^k e^{\theta_j \cdot x^{(i)}}}\\ =&x^{(i)}\cdot (1-P(y^{(l)}=1|x^{(i)},k,\theta)) \end{aligned} ====θllogj=1keθjx(i)eθlTx(i)eθlTx(i)j=1keθjx(i)θlj=1keθjx(i)eθlTx(i)eθlTx(i)j=1keθjx(i)(j=1keθjx(i))2eθlTx(i)x(i)j=1keθjx(i)eθlTx(i)eθlTx(i)x(i)j=1keθjx(i)x(i)(j=1keθjx(i)eθlTx(i))x(i)(1P(y(l)=1x(i),k,θ))
然后带入到∂J(θ)θl\frac{\partial J(\theta)}{\theta_l}θlJ(θ) 中,就可以得到UFLDL中的那个代价函数
∂J(θ)∂θj=−1m[∑i=1mx(i)⋅(1{y(i)=j}−P(y(i)=j∣x(i);θ))]\frac{\partial J(\theta)}{\partial\theta_j}=-\frac{1}{m}\left[\sum_{i=1}^mx^{(i)}\cdot (1\{y^{(i)}=j\}-P(y^{(i)}=j|x^{(i)};\theta))\right] θjJ(θ)=m1[i=1mx(i)(1{y(i)=j}P(y(i)=jx(i)θ))]
梯度下降法的时候就直接使用
θj=θj−α∂J(θ)∂θj\theta_j=\theta_j-\alpha\frac{\partial J(\theta)}{\partial \theta_j} θj=θjαθjJ(θ)

权重衰减

先看UFLDL中的一个式子
P(y(i)=j∣x(i);θ)=e(θj−ψ)T⋅x(i)∑l=1ke(θj−ψ)T⋅x(i)=e(θj)T⋅x(i)∑l=1ke(θj)T⋅x(i)\begin{aligned} P(y^{(i)}=j|x^{(i)};\theta)&=\frac{e^{(\theta_j-\psi)^T\cdot x^{(i)}}}{\sum_{l=1}^k e^{(\theta_j-\psi)^T\cdot x^{(i)}}}\\ &=\frac{e^{(\theta_j)^T\cdot x^{(i)}}}{\sum_{l=1}^k e^{(\theta_j)^T\cdot x^{(i)}}}\\ \end{aligned} P(y(i)=jx(i);θ)=l=1ke(θjψ)Tx(i)e(θjψ)Tx(i)=l=1ke(θj)Tx(i)e(θj)Tx(i)
可以看出权重减去一个向量与不减去这个向量得到的结果一样,说明这个求得的权重参数是冗余的,也就是说最小化代价函数J(θ)J(\theta)J(θ)的解不唯一,如果θ\thetaθ是解,那么θ−ψ\theta-\psiθψ也是一个最优解。这就引出了“权重衰减”,用于解决softmax回归的参数冗余带来的数值问题。

新的代价函数为
J(θ)=−1m[∑i=1m∑j=1k1{y(i)=j}log⁡P(y(i)=j∣x(i);θ)]+12λ∑i=1k∑j=0nθij2J(\theta)=-\frac{1}{m}\left[\sum_{i=1}^m\sum_{j=1}^k1\{y^{(i)}=j\}\log P(y^{(i)}=j|x^{(i)};\theta) \right]+\frac{1}{2}\lambda\sum_{i=1}^k\sum_{j=0}^n\theta_{ij}^2 J(θ)=m1[i=1mj=1k1{y(i)=j}logP(y(i)=jx(i);θ)]+21λi=1kj=0nθij2
这样加入了权重衰减以后,能够保证代价函数J(θ)J(\theta)J(θ)是严格的凸函数,并且有唯一解。
∂J(θ)∂θj=−1m[∑i=1mx(i)⋅(1{y(i)=j}−P(y(i)=j∣x(i);θ))]+λθj\frac{\partial J(\theta)}{\partial\theta_j}=-\frac{1}{m}\left[\sum_{i=1}^mx^{(i)}\cdot (1\{y^{(i)}=j\}-P(y^{(i)}=j|x^{(i)};\theta))\right]+\lambda\theta_j θjJ(θ)=m1[i=1mx(i)(1{y(i)=j}P(y(i)=jx(i)θ))]+λθj
何时使用softmax?

当所有的类别互斥的时候就选择softmax分类器,比如:古典音乐、乡村音乐、摇滚乐和爵士乐;但是如果是人声音乐、舞曲、影视原声、流行歌曲,那就最好还是用四个二元logistic分类器了,因为一首歌曲可以来源于影视原声,同时也包含人声。

代码解读

参考UFLDL上的顺序编程,文末会给出全部程序。

(1) 四准备

  • 手写数字数据文件
  • 读取数据的MATLAB程序
  • 需要补全的softmax分类器程序
  • computeNumericalGradient源码

(2) 初始化参数和读数据

需要初始化的参数是输入大小、总类别数目、权重衰减、初始模型参数θ\thetaθ

inputSize = 28 * 28; % Size of input vector (MNIST images are 28x28)
numClasses = 10;     % Number of classes (MNIST images fall into 10 classes)
lambda = 1e-4; % Weight decay parameter
% Randomly initialise theta
theta = 0.005 * randn(numClasses * inputSize, 1);
theta = reshape(theta, numClasses, inputSize);

读数据有提供实例,主要注意的是将标签0改为10,读取数据的时候已经自动归一化到

addpath ../data/mnist
images = loadMNISTImages('train-images-idx3-ubyte');
labels = loadMNISTLabels('train-labels-idx1-ubyte');
labels(labels==0) = 10; % Remap 0 to 10

(3) 损失函数的书写

在官方代码中,损失函数并未补全,但是提供了实现技巧:

  • 计算真实值矩阵(ground truth matrix )

其实就是每个样本的示性函数,matlab中有自带的函数可以做到这一点,利用sparse可以将对应样本的对应标签标注出来,比如labels是60000×160000\times160000×1的标签向量,标记了60000个样本分属标签,numCases是总样本数目60000,那么sparse(labels,1:numCases,1)表示的就是一个60000行的稀疏矩阵,最后一行是(8,60000) 1意思是第60000个样本对应第八个标签;为了将稀疏矩阵转换为10×6000010\times 6000010×60000的单热度(one hot)编码,那就需要对稀疏矩阵调用一个full函数,其实计算真实值矩阵就是一句话

groundTruth = full(sparse(labels, 1:numCases, 1));
  • 计算梯度函数

∂J(θ)∂θj=−1m[∑i=1mx(i)⋅(1{y(i)=j}−P(y(i)=j∣x(i);θ))]+λθj=−1m[∑i=1mx(i)⋅(1{y(i)=j}−e(θj)T⋅x(i)∑l=1ke(θj)T⋅x(i)]+λθj\begin{aligned} \frac{\partial J(\theta)}{\partial\theta_j}&=-\frac{1}{m}\left[\sum_{i=1}^mx^{(i)}\cdot (1\{y^{(i)}=j\}-P(y^{(i)}=j|x^{(i)};\theta))\right]+\lambda\theta_j\\ &=-\frac{1}{m}\left[\sum_{i=1}^mx^{(i)}\cdot (1\{y^{(i)}=j\}-\frac{e^{(\theta_j)^T\cdot x^{(i)}}}{\sum_{l=1}^k e^{(\theta_j)^T\cdot x^{(i)}}}\right]+\lambda\theta_j \end{aligned} θjJ(θ)=m1[i=1mx(i)(1{y(i)=j}P(y(i)=jx(i)θ))]+λθj=m1[i=1mx(i)(1{y(i)=j}l=1ke(θj)Tx(i)e(θj)Tx(i)]+λθj

式子是分别对连接到每一个输出标签的权重求梯度,这里直接用矩阵把所有的权重梯度一次性求出来,先看看参数θ\thetaθ10×78410\times78410×784的矩阵,data是784×60000784\times 60000784×60000的矩阵,第一维是每张图片的大小28×2828\times2828×28被拉长为一个向量,groundTruth是10×6000010\times6000010×60000的矩阵,梯度求解三个步骤:求分母,求分数项,求这个损失函数梯度(可以不用人工计算梯度,方法看下一个小步骤)

M = exp(theta*data);
M = bsxfun(@rdivide, M, sum(M));
thetagrad = (-1/size(data,2)).*(((groundTruth-(M))*data') + (lambda*theta));

顺便也可以计算一下损失函数

cost = (-1/size(data,2)).*sum(sum(groundTruth.*log(M)));
cost = cost + (lambda/2).*sum(sum(theta.^2));

为了后续方便,为这一步骤定义一个函数称为

function [cost, grad] = softmaxCost(theta, numClasses, inputSize, lambda, data, labels)

(4) matlab自动梯度优化

随后可能与理论部分有点区别了,正常求解是直接用当前权重减去步长和梯度的乘积就是新的模型参数也就是θj=θi−α∇θi\theta_j=\theta_i-\alpha\nabla\theta_iθj=θiαθi,但是呢UFLDL中提供了另一种快速解法,直接使用MATLAB的优化函数minFunc,关于此函数的解释可以戳这里 ,所以我们可以利用此函数对上面定义的损失函数的最小值,而且minFunc提供了几个很好地求梯度方法,这里使用大规模优化算法(LBFGS)代替上面人工计算的损失函数的梯度。

if ~exist('options', 'var')options = struct;
end
if ~isfield(options, 'maxIter')options.maxIter = 400;
end
% initialize parameters
theta = 0.005 * randn(numClasses * inputSize, 1);
% Use minFunc to minimize the function
% addpath minFunc/
options.Method = 'lbfgs'; % Here, we use L-BFGS to optimize our cost% function. Generally, for minFunc to work, you% need a function pointer with two outputs: the% function value and the gradient. In our problem,% softmaxCost.m satisfies this.
options.display = 'on';
% options.displayImage = false;
[softmaxOptTheta, cost] = minFunc( @(p) softmaxCost(p, ...numClasses, inputSize, lambda, ...inputData, labels), ...                     theta, options);
% Fold softmaxOptTheta into a nicer format
softmaxModel.optTheta = reshape(softmaxOptTheta, numClasses, inputSize);
softmaxModel.inputSize = inputSize;
softmaxModel.numClasses = numClasses;

这里优化的时候会自动优化(3)中输出项的第一个cost,而非第二项grad

这样就得到了模型参数了,可以进入测试阶段了

(5)测试阶段

先读数据

images = loadMNISTImages('t10k-images-idx3-ubyte');
labels = loadMNISTLabels('t10k-labels-idx1-ubyte');
labels(labels==0) = 10; % Remap 0 to 10
inputData = images;

预测标签

M = exp(theta*inputdata);
M = bsxfun(@rdivide, M, sum(M));
[temp pred] = max(M);

计算准确率

acc = mean(labels(:) == pred(:));
fprintf('Accuracy: %0.3f%%\n', acc * 100);

logistic回归和softmax关系

其实logistic回归就是具有两种类别的softmax, 直接由softmax推导看看(注意softmax具有参数冗余特性, 靠的是权重衰解决的):
1eθ1x+eθ2x[eθ1∗xeθ2∗x]=1e0∗x+e(θ2−θ1)x[e0∗xe(θ2−θ1)∗x]=11+eθ′∗x[1eθ′∗x]\begin{aligned} &\frac{1}{e^{\theta_1 x}+e^{\theta_2 x}} \begin{bmatrix} e^{\theta_1 * x } \\ e^{\theta_2* x} \end{bmatrix} \\ =&\frac{1}{e^{0* x}+e^{(\theta_2-\theta_1) x}} \begin{bmatrix} e^{0* x } \\ e^{(\theta_2-\theta_1)* x} \end{bmatrix} \\ =&\frac{1}{1+e^{\theta '*x}} \begin{bmatrix} 1\\ e^{\theta'*x} \end{bmatrix} \end{aligned} ==eθ1x+eθ2x1[eθ1xeθ2x]e0x+e(θ2θ1)x1[e0xe(θ2θ1)x]1+eθx1[1eθx]

结语

以上便是整个流程了,可运行代码下载戳此处

给各位大佬们提个建议哈,大部分代码不是能够一次性运行成功的,如果是计算机专业,强烈建议自行分析整个程序,嘿嘿,加油。若有错误,多多指正

本文已经同步到微信公众号中,公众号与本博客将持续同步更新运动捕捉、机器学习、深度学习、计算机视觉算法,敬请关注
在这里插入图片描述

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

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

相关文章

二值RBM与实值RBM理论及代码解读

1. 前言 虽然推导过二值形式的RBM&#xff0c;但是对于可见层为实值的输入还是半知半解的。最近写个深度学习相关综述&#xff0c;看了一些关于RBM的文献&#xff0c;这里做一下对比总结。但是不倾向于对实值RBM的推导&#xff0c;而是相关代码的实现。 2. RBM回顾 RBM是具有…

【caffe-Windows】添加工程-以classification为例

前言 兴趣所向&#xff0c;研究一下如何在caffe工程之外建立一个属于自己的工程&#xff0c;这里以分类为例&#xff0c;将classification.cpp提取出来&#xff0c;然后调用相应的三方库和libcaffe.lib进行编译。这里比较建议有一丢丢C功底的同志参考学习&#xff0c;主要涉及…

MKL学习——数学运算库安装调试

前言 最近要用C折腾一些东西&#xff0c;涉及到矩阵运算&#xff0c;看了一下网上推荐的数学库&#xff0c;貌似MKL还是蛮不错滴&#xff0c;放到VS2013里面试试 国际惯例&#xff0c;来波地址 blas, cblas, openblas, atlas, lapack, mkl性能对比 Compiling and Linking I…

MKL学习——向量操作

前言 推荐两个比较好的教程: BLAS (Basic Linear Algebra Subprograms) LAPACK for Windows 命名规范 BLAS基本线性代数子程序的函数命令都有一定规范&#xff0c;便于记忆 <character> <name> <mod> () character 定义的是数据类型 s实数域&#…

【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 理…