HSIC Bottleneck的C++程序实现
论文【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++程序实现相关推荐
- 读文献 THE HSIC BOTTLENECK: DEEP LEARNING WITHOUT BACK-PROPAGATION 阅读心得
题目:THE HSIC BOTTLENECK: DEEP LEARNING WITHOUT BACK-PROPAGATION Abstract 这篇文章介绍了深度学习训练中的HSIC瓶颈(希尔伯特-施 ...
- 不用反向传播的HSIC Bottleneck到底讲了啥,及其keras实现
机器之心上周介绍了一篇论文,说是不用BP也能训练神经网络,论文叫做<The HSIC Bottleneck: Deep Learning without Back-Propagation> ...
- HSIC简介:一个有意思的判断相关性的思路
作者丨苏剑林 单位丨追一科技 研究方向丨NLP,神经网络 个人主页丨kexue.fm 前段时间在机器之心看到这样的一个推送彻底解决梯度爆炸问题,新方法不用反向传播也能训练 ResNet,当然,媒体的标 ...
- HSIC and MMD
1. HSIC 博客链接:HSIC简介:一个有意思的判断相关性的思路 前几天,在机器之心看到这样的一个推送<彻底解决梯度爆炸问题,新方法不用反向传播也能训练ResNet>,当然,媒体的标题 ...
- 编程精粹 --Microsoft编写优质无错C程序秘诀
献给我的妻子Beth, 以及我的双亲Joseph和Julia Maguire ────为了他们的爱和支持 序 1986年,在为几家小公司咨询和工作了10年之后为了获得编写Macintosh应用程序的经 ...
- 【AAAI 2020】全部接受论文列表(三)
来源:AINLPer微信公众号(点击了解一下吧) 编辑: ShuYini 校稿: ShuYini 时间: 2020-01-22 最近武汉肺炎形势严峻,请小伙伴们带好口罩,做好防护,大家新年快乐~ ...
- 干货!重新思考希尔伯特-施密特信息瓶颈在对抗性鲁棒性中的应用
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 本文首次提出将希尔伯特-施密特信息瓶颈(HSIC Information Bottleneck)用于神经网络优化目标中的正则项来提升模型 ...
- POCO C++库学习和分析 -- 序
POCO C++库学习和分析 -- 序 1. POCO库概述: POCO是一个C++的开源库集.同一般的C++库相比,POCO的特点是提供了整一个应用框架.如果要做C++程序应用框架的快速开发,我觉得 ...
- 小程序 缩放_缩放流星应用程序的初体验
小程序 缩放 by Elie Steinbock 埃莉·斯坦博克(Elie Steinbock) 缩放流星应用程序的初体验 (First Experiences Scaling a Meteor Ap ...
最新文章
- BCH欢迎ETH使用BCH作为数据层
- 如何获取本地安装的Python模块列表?
- 成为最差开发者的10条建议
- python 多维数组删除重复
- LeetCode Mini Parser(栈操作)
- Maven最佳实践:版本管理
- asp.net core新特性(1):TagHelper
- 织梦缩略图自动补齐绝对路径_织梦生成文章内容缩略图时自动加上绝对路径教程...
- 【MHA】--MHA 介绍(1)
- as3实现(可以操纵的)真正的由惯性导致的漂移
- Linux配置本地端口映射
- 如何批量修改图片尺寸而不变形?
- 看电影读小说,你就能懂经济学
- python 分析泰坦尼克号生还率_泰坦尼克号上谁的生存几率更大?Kaggle 金牌得主 Python 数据挖掘框架发现真相...
- C语言-投票选举问题
- 百年IBM:值得全球商界研究的转型变革典范
- sigmod 函数与softmax 函数对比
- c语言如何统计不同分数段学生人数,excel中如何统计不同班级各个分数段的学生人数...
- (超详细)强大的grid布局
- HTML中br标记和p标记区别,在 HTML 文档中,段落标记
热门文章
- 2019年国赛高教杯数学建模C题机场的出租车问题解题全过程文档及程序
- 业余-----中国当代内地影视明星123
- Hadoop学习——最大的敌人是自己
- 成功解决IDM拦截了根据baidupcs.com网站设置只能请求一次的下载···问题
- 2016年MBA备考路
- 前端面试之手写代码篇
- python利用proxybroker构建爬虫免费IP代理池!不用担心被封了!
- Vjudge STL题——A+B
- 深度Linux下的中望CAD软件,中望CAD Linux预装版的功能介绍,在Deepin和UOS下安装很简单...
- 请概述计算机技术的发展是现代核磁共振光谱法得以应用的关键,现代分析技术概述.ppt...