论文【The HSIC Bottleneck: Deep Learning without Back-Propagation】中HSIC方法的C++实现程序:

#include
#include
//稠密矩阵的代数运算(逆、特征值等)
#include

using namespace Eigen;
using namespace std;
#define sigma 2
#define lambda 100

vector<vector> kernelmat(vector<vector> x)
{
int m = x.size(), dim = x[0].size();
vector<vector> H(m, vector(m, -1.0 / 128));
for (int i = 0; i < m; i++)
{
H[i][i] = 1 + H[i][i];
}
vector r(m);
for (int i = 0; i < m; i++)
{
double sum_value = 0;
for (int j = 0; j < dim; j++)
{
sum_value += x[i][j]* x[i][j];
}
r[i] = sum_value;
}
vector<vector> a(m, vector(m));
for (int i = 0; i < m; i++)
{
for (int j = 0; j < m; j++)
{
double sum_value = 0;
for (int p = 0; p < dim; p++)
{
sum_value += x[i][p] * x[j][p];
}
a[i][j] = sum_value;
}
}
vector<vector> D(m, vector(m));
for (int i = 0; i < m; i++)
{
for (int j = 0; j < m; j++)
{
D[i][j] = abs(-2 * a[i][j] + r[j] + r[i]);
}
}
double variance = dim * sigma*sigma * 2;
vector<vector> Kx(m, vector(m));
for (int i = 0; i < m; i++)
{
for (int j = 0; j < m; j++)
{
Kx[i][j] = exp(-D[i][j] / variance);
}
}
vector<vector> Kxc(m, vector(m));
for (int i = 0; i < m; i++)
{
for (int j = 0; j < m; j++)
{
double sum_value = 0;
for (int p = 0; p < m; p++)
{
sum_value += Kx[i][p] * H[j][p];
}
Kxc[i][j] = sum_value;
}
}

return Kxc;

}

template
vector<vector> make_matrix(const _Tp* data, const int rows, const int cols)
{
vector<vector > c(rows, vector(cols));
for (int y = 0; y < rows; ++y)
{
for (int x = 0; x < cols; ++x)
{
c[y][x] = data[y * cols + x];
}
}
return c;
}

double hsic_normalized_cca(vector<vector> x, vector<vector> y)
{
vector<vector> Kxc = kernelmat(x);
vector<vector> Kyc = kernelmat(y);
int m = Kxc.size();
vector<vector> Kxc_j(m, vector(m)), Kyc_j(m, vector(m));
for (int i = 0; i < m; i++)
{
for (int j = 0; j < m; j++)
{
i == j ? Kxc_j[i][j] = epsilon * m * 1 + Kxc[i][j] : Kxc_j[i][j] = Kxc[i][j];
i == j ? Kyc_j[i][j] = epsilon * m * 1 + Kyc[i][j] : Kyc_j[i][j] = Kyc[i][j];
}
}

vector<float> fn1, fn2;
for (int i = 0; i < Kxc_j.size(); i++)
{<!-- -->for (int j = 0; j < Kxc_j[0].size(); j++){<!-- -->fn1.push_back(Kxc_j[i][j]);}
}
Map<matrixxf> map_x(fn1.data(), Kxc_j.size(), Kxc_j[0].size());
Eigen::MatrixXf map_i = map_x.inverse();
vector<vector<float>> Kxc_i = make_matrix<float>(map_i.data(), Kxc_j.size(), Kxc_j[0].size());for (int i = 0; i < Kyc_j.size(); i++)
{<!-- -->for (int j = 0; j < Kyc_j[0].size(); j++){<!-- -->fn2.push_back(Kyc_j[i][j]);}
}
Map<matrixxf> map_y(fn2.data(), Kyc_j.size(), Kyc_j[0].size());
Eigen::MatrixXf map_j = map_y.inverse();
vector<vector<float>> Kyc_i = make_matrix<float>(map_j.data(), Kyc_j.size(), Kyc_j[0].size());vector<vector<double>> Rx(m, vector<double>(m)), Ry(m, vector<double>(m));
for (int i = 0; i < m; i++)
{<!-- -->for (int j = 0; j < m; j++){<!-- -->double sum_value_x = 0, sum_value_y = 0;for (int p = 0; p < m; p++){<!-- -->sum_value_x += Kxc[i][p] * Kxc_i[p][j];sum_value_y += Kyc[i][p] * Kyc_i[p][j];}Rx[i][j] = sum_value_x;Ry[i][j] = sum_value_y;}
}
double Pxy = 0;
for (int i = 0; i < m; i++)
{<!-- -->for (int j = 0; j < m; j++){<!-- -->Pxy += Rx[i][j] * Ry[j][i];}
}
return Pxy;

}

void main()
{
double hsic_hy_val = hsic_normalized_cca(hidden, h_target);
double hsic_hx_val = hsic_normalized_cca(hidden, h_data);
double loss = hsic_hx_val - lambda * hsic_hy_val;
}
</vector</vector</vector</vector</vector</vector</vector</vector</vector</vector</vector</vector</vector</vector</vector</vector</vector
其中,hidden为隐藏层的输出矩阵,h_target为标签矩阵,h_data为输入矩阵。
文章转自:HSIC Bottleneck的C++程序实现_Java-答学网

作者:答学网,转载请注明原文链接:http://www.dxzl8.com/

HSIC Bottleneck的C++程序实现相关推荐

  1. 读文献 THE HSIC BOTTLENECK: DEEP LEARNING WITHOUT BACK-PROPAGATION 阅读心得

    题目:THE HSIC BOTTLENECK: DEEP LEARNING WITHOUT BACK-PROPAGATION Abstract 这篇文章介绍了深度学习训练中的HSIC瓶颈(希尔伯特-施 ...

  2. 不用反向传播的HSIC Bottleneck到底讲了啥,及其keras实现

    机器之心上周介绍了一篇论文,说是不用BP也能训练神经网络,论文叫做<The HSIC Bottleneck: Deep Learning without Back-Propagation> ...

  3. HSIC简介:一个有意思的判断相关性的思路

    作者丨苏剑林 单位丨追一科技 研究方向丨NLP,神经网络 个人主页丨kexue.fm 前段时间在机器之心看到这样的一个推送彻底解决梯度爆炸问题,新方法不用反向传播也能训练 ResNet,当然,媒体的标 ...

  4. HSIC and MMD

    1. HSIC 博客链接:HSIC简介:一个有意思的判断相关性的思路 前几天,在机器之心看到这样的一个推送<彻底解决梯度爆炸问题,新方法不用反向传播也能训练ResNet>,当然,媒体的标题 ...

  5. 编程精粹 --Microsoft编写优质无错C程序秘诀

    献给我的妻子Beth, 以及我的双亲Joseph和Julia Maguire ────为了他们的爱和支持 序 1986年,在为几家小公司咨询和工作了10年之后为了获得编写Macintosh应用程序的经 ...

  6. 【AAAI 2020】全部接受论文列表(三)

    来源:AINLPer微信公众号(点击了解一下吧) 编辑: ShuYini 校稿: ShuYini 时间: 2020-01-22 最近武汉肺炎形势严峻,请小伙伴们带好口罩,做好防护,大家新年快乐~    ...

  7. 干货!重新思考希尔伯特-施密特信息瓶颈在对抗性鲁棒性中的应用

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 本文首次提出将希尔伯特-施密特信息瓶颈(HSIC Information Bottleneck)用于神经网络优化目标中的正则项来提升模型 ...

  8. POCO C++库学习和分析 -- 序

    POCO C++库学习和分析 -- 序 1. POCO库概述: POCO是一个C++的开源库集.同一般的C++库相比,POCO的特点是提供了整一个应用框架.如果要做C++程序应用框架的快速开发,我觉得 ...

  9. 小程序 缩放_缩放流星应用程序的初体验

    小程序 缩放 by Elie Steinbock 埃莉·斯坦博克(Elie Steinbock) 缩放流星应用程序的初体验 (First Experiences Scaling a Meteor Ap ...

最新文章

  1. BCH欢迎ETH使用BCH作为数据层
  2. 如何获取本地安装的Python模块列表?
  3. 成为最差开发者的10条建议
  4. python 多维数组删除重复
  5. LeetCode Mini Parser(栈操作)
  6. Maven最佳实践:版本管理
  7. asp.net core新特性(1):TagHelper
  8. 织梦缩略图自动补齐绝对路径_织梦生成文章内容缩略图时自动加上绝对路径教程...
  9. 【MHA】--MHA 介绍(1)
  10. as3实现(可以操纵的)真正的由惯性导致的漂移
  11. Linux配置本地端口映射
  12. 如何批量修改图片尺寸而不变形?
  13. 看电影读小说,你就能懂经济学
  14. python 分析泰坦尼克号生还率_泰坦尼克号上谁的生存几率更大?Kaggle 金牌得主 Python 数据挖掘框架发现真相...
  15. C语言-投票选举问题
  16. 百年IBM:值得全球商界研究的转型变革典范
  17. sigmod 函数与softmax 函数对比
  18. c语言如何统计不同分数段学生人数,excel中如何统计不同班级各个分数段的学生人数...
  19. (超详细)强大的grid布局
  20. HTML中br标记和p标记区别,在 HTML 文档中,段落标记

热门文章

  1. 2019年国赛高教杯数学建模C题机场的出租车问题解题全过程文档及程序
  2. 业余-----中国当代内地影视明星123
  3. Hadoop学习——最大的敌人是自己
  4. 成功解决IDM拦截了根据baidupcs.com网站设置只能请求一次的下载···问题
  5. 2016年MBA备考路
  6. 前端面试之手写代码篇
  7. python利用proxybroker构建爬虫免费IP代理池!不用担心被封了!
  8. Vjudge STL题——A+B
  9. 深度Linux下的中望CAD软件,中望CAD Linux预装版的功能介绍,在Deepin和UOS下安装很简单...
  10. 请概述计算机技术的发展是现代核磁共振光谱法得以应用的关键,现代分析技术概述.ppt...