4. BatchNorm和NonLinearity 实现
admin
2024-03-02 03:50:14
0

[C++ 基于Eigen库实现CRN前向推理]

第三部分:TransposedConv2d实现 (含dilation)

  • 前言:(Eigen库使用记录)
  • 第一部分:WavFile.class (实现读取wav/pcm,实现STFT)
  • 第二部分:Conv2d实现
  • 第三部分:TransposedConv2d实现 (mimo,padding,stride,dilation,kernel,outpadding)
  • 第四部分:NonLinearity (Sigmoid,Tanh,ReLU,ELU,Softplus)
  • 第五部分:LSTM
  • GITHUB仓库

1. 基于Eigen实现BatchNorm2d

1.1 Layer_BatchNorm2d.h
//
// Created by Koer on 2022/10/31.
//#ifndef CRN_LAYER_BATCHNORM2D_H
#define CRN_LAYER_BATCHNORM2D_H#include "Eigen"
#include "mat.h"
#include "Eigen/CXX11/Tensor"class Layer_BatchNorm2d {
public:Layer_BatchNorm2d();Layer_BatchNorm2d(int64_t bn_ch);void LoadState(MATFile *pmFile, const std::string &state_preffix);void LoadTestState();Eigen::Tensor forward(Eigen::Tensor &input);private:int64_t channels;Eigen::Tensor weights;Eigen::Tensor bias;Eigen::Tensor running_mean;Eigen::Tensor running_var;int32_t num_batches_tracked;};#endif //CRN_LAYER_BATCHNORM2D_H
1.2 Layer_BatchNorm2d.cpp
//
// Created by Koer on 2022/10/31.
//
#include "iostream"
#include "../include/Layer_BatchNorm2d.h"Layer_BatchNorm2d::Layer_BatchNorm2d() {this->channels = 1;
}Layer_BatchNorm2d::Layer_BatchNorm2d(int64_t bn_ch) {this->channels = bn_ch;
}void Layer_BatchNorm2d::LoadState(MATFile *pmFile, const std::string &state_preffix) {std::string weight_name = state_preffix + "_weight";std::string bias_name = state_preffix + "_bias";std::string rm_name = state_preffix + "_running_mean";std::string rv_name = state_preffix + "_running_var";std::string nbt_name = state_preffix + "_num_batches_tracked";mxArray *pa = matGetVariable(pmFile, weight_name.c_str());auto *values = (float_t *) mxGetData(pa);long long dim1 = mxGetM(pa);long long dim2 = mxGetN(pa);this->weights.resize(dim1, dim2);int idx = 0;for (int i = 0; i < dim2; i++) {for (int j = 0; j < dim1; j++) {this->weights(j, i) = values[idx++];}}// std::cout << this->weights << std::endl;pa = matGetVariable(pmFile, bias_name.c_str());values = (float_t *) mxGetData(pa);dim1 = mxGetM(pa);dim2 = mxGetN(pa);this->bias.resize(dim1, dim2);idx = 0;for (int i = 0; i < dim2; i++) {for (int j = 0; j < dim1; j++) {this->bias(j, i) = values[idx++];}}// std::cout << this->bias << std::endl;pa = matGetVariable(pmFile, rm_name.c_str());values = (float_t *) mxGetData(pa);dim1 = mxGetM(pa);dim2 = mxGetN(pa);this->running_mean.resize(dim1, dim2);idx = 0;for (int i = 0; i < dim2; i++) {for (int j = 0; j < dim1; j++) {this->running_mean(j, i) = values[idx++];}}// std::cout << this->running_mean << std::endl;pa = matGetVariable(pmFile, rv_name.c_str());values = (float_t *) mxGetData(pa);dim1 = mxGetM(pa);dim2 = mxGetN(pa);this->running_var.resize(dim1, dim2);idx = 0;for (int i = 0; i < dim2; i++) {for (int j = 0; j < dim1; j++) {this->running_var(j, i) = values[idx++];}}// std::cout << this->running_var << std::endl;pa = matGetVariable(pmFile, nbt_name.c_str());auto nbt_value = (int32_t *) mxGetData(pa);this->num_batches_tracked = nbt_value[0];// std::cout << this->num_batches_tracked << std::endl;
}void Layer_BatchNorm2d::LoadTestState() {Eigen::Tensor w(1, this->channels);Eigen::Tensor b(1, this->channels);Eigen::Tensor rm(1, this->channels);Eigen::Tensor rv(1, this->channels);w.setConstant(1);b.setConstant(0);rm.setConstant(1);rv.setConstant(2);this->weights = w;this->bias = b;this->running_mean = rm;this->running_var = rv;
}Eigen::Tensor Layer_BatchNorm2d::forward(Eigen::Tensor &input) {int64_t N_CHANNEL = this->channels;const Eigen::Tensor::Dimensions &dim_inp = input.dimensions();Eigen::Tensor output(dim_inp);Eigen::Tensor cur_channel(dim_inp[0], dim_inp[2], dim_inp[3]);Eigen::Tensor cur_res(dim_inp[0], dim_inp[2], dim_inp[3]);Eigen::Tensor cur_w(dim_inp[0], dim_inp[2], dim_inp[3]);Eigen::Tensor cur_b(dim_inp[0], dim_inp[2], dim_inp[3]);Eigen::Tensor cur_mean(dim_inp[0], dim_inp[2], dim_inp[3]);Eigen::Tensor cur_var(dim_inp[0], dim_inp[2], dim_inp[3]);for (int c = 0; c < N_CHANNEL; c++) {cur_channel = input.chip(c, 1);cur_w.setConstant(this->weights(0, c));cur_b.setConstant(this->bias(0, c));cur_mean.setConstant(this->running_mean(0, c));cur_var.setConstant(this->running_var(0, c));cur_res = (cur_channel - cur_mean) / cur_var.pow(0.5) * cur_w + cur_b;output.chip(c, 1) = cur_res;}return output;
}

2. 基于Eigen实现Nonlinearity

2.1 NonLinearity.h
//
// Created by Koer on 2022/10/31.
//#ifndef CRN_NONLINEARITY_H
#define CRN_NONLINEARITY_H#include "Eigen"
#include "Eigen/CXX11/Tensor"class NonLinearity {
public:NonLinearity();Eigen::Tensor ELU(Eigen::Tensor &input, float_t alpha = 1.0);Eigen::Tensor ReLU(Eigen::Tensor &input);Eigen::Tensor Softplus(Eigen::Tensor &input, float_t beta = 1.0, float_t threshold = 20.0);};#endif //CRN_NONLINEARITY_H
2.2 NonLinearity.cpp
//
// Created by Koer on 2022/10/31.
//#include "../include/NonLinearity.h"NonLinearity::NonLinearity() {}Eigen::Tensor NonLinearity::ELU(Eigen::Tensor &input, float_t alpha) {const Eigen::Tensor::Dimensions &d = input.dimensions();Eigen::Tensor output(d);for (int i = 0; i < d[0]; i++) {for (int j = 0; j < d[1]; j++) {for (int k = 0; k < d[2]; k++) {for (int l = 0; l < d[3]; l++) {if (input(i, j, k, l) <= 0) {output(i, j, k, l) = alpha * exp(input(i, j, k, l)) - 1;} else {output(i, j, k, l) = input(i, j, k, l);}}}}}return output;
}Eigen::Tensor NonLinearity::ReLU(Eigen::Tensor &input) {const Eigen::Tensor::Dimensions &d = input.dimensions();Eigen::Tensor output(d);for (int i = 0; i < d[0]; i++) {for (int j = 0; j < d[1]; j++) {for (int k = 0; k < d[2]; k++) {for (int l = 0; l < d[3]; l++) {if (input(i, j, k, l) <= 0) {output(i, j, k, l) = 0.0;} else {output(i, j, k, l) = input(i, j, k, l);}}}}}return output;
}Eigen::Tensor NonLinearity::Softplus(Eigen::Tensor &input, float_t beta, float_t threshold) {const Eigen::Tensor::Dimensions &d = input.dimensions();Eigen::Tensor output(d);for (int i = 0; i < d[0]; i++) {for (int j = 0; j < d[1]; j++) {for (int k = 0; k < d[2]; k++) {for (int l = 0; l < d[3]; l++) {if (input(i, j, k, l) * beta <= threshold) {output(i, j, k, l) = logf(1 + expf((input(i, j, k, l) * beta)) / beta);} else {output(i, j, k, l) = input(i, j, k, l);}}}}}return output;
}

相关内容

热门资讯

安卓系统为什么会赢,技术革新与... 你有没有想过,为什么安卓系统在智能手机市场上如此火爆,几乎成了“手机必备”的存在呢?今天,就让我带你...
电脑可以做安卓系统么,电脑上运... 你有没有想过,电脑能不能装上安卓系统呢?这听起来是不是有点像科幻电影里的情节?别急,让我带你一探究竟...
国产安卓系统碎片化软件,软件生... 你有没有发现,现在手机上的安卓系统越来越丰富多样了?没错,这就是我们今天要聊的话题——国产安卓系统的...
安卓系统的蚂蚁花呗,蚂蚁花呗在... 你知道吗?在安卓系统的世界里,有一个超级方便的支付工具,那就是蚂蚁花呗。它就像你的贴心小助手,让你在...
安卓2系统彩蛋在哪找,揭秘隐藏... 你有没有发现,安卓2系统里竟然隐藏着一些神秘的彩蛋?没错,就是那些让你忍不住想要一探究竟的小惊喜。今...
全球最大的安卓系统,全球最大移... 你知道吗?在智能手机的世界里,有一个系统可是当之无愧的“王者”——那就是安卓系统!它就像一位全能的魔...
安卓系统就没有碎片了,迈向无缝... 你知道吗?最近在科技圈里,安卓系统可是掀起了一阵不小的波澜呢!有人说,安卓系统再也没有碎片化了?这可...
安卓系统平板电脑评测,安卓平板... 你有没有想过,在这个信息爆炸的时代,拥有一台性能卓越的安卓系统平板电脑,简直就是移动办公和娱乐的完美...
双系统安卓自动关机,双系统安卓... 你有没有遇到过这样的情况:手机里装了双系统安卓,一边是工作用的,一边是娱乐用的,结果有时候不小心,手...
圣地安列斯安卓9系统,圣地安列... 亲爱的读者,你是否也像我一样,对科技新动态充满好奇?今天,我要和你分享一个超级有趣的话题——圣地安列...
平果有安卓系统的吗,畅享智能生... 你有没有想过,手机的世界里,竟然还有这样一个有趣的现象?那就是——平果手机,竟然也有安卓系统!是不是...
vivoy27安卓系统下载,畅... 你有没有听说最近Vivo Y27这款手机的新鲜事儿?没错,就是它的安卓系统下载!今天,我就要给你来个...
安卓系统最强定位手机版,最强定... 你有没有想过,在茫茫人海中,如何让你的手机定位功能像侦探一样精准无误?今天,就让我带你一探究竟,揭秘...
安卓运行环境选哪个系统,And... 你有没有想过,你的安卓手机到底是在哪个运行环境下才能发挥出最佳性能呢?这可是个技术活儿,选对了系统,...
zui15系统是安卓系统吗,揭... 亲爱的读者,你是否曾好奇过,那些在手机上运行得风生水起的系统,它们究竟是不是安卓的呢?今天,就让我带...
ios系统和安卓系统权限区别,... 你有没有发现,无论是手机还是平板,我们用的最多的就是那些APP了。而这些APP,它们在手机里可是有着...
荣耀手环6安卓版系统,智能生活... 你有没有注意到,最近你的手腕上是不是多了一抹亮丽的色彩?没错,说的就是荣耀手环6安卓版系统!这款智能...
极品奴隶系统下载安卓版,体验独... 你有没有听说过那个超级火的“极品奴隶系统”安卓版?最近,这款游戏在朋友圈里可是炸开了锅,大家都说它好...
安卓手机苹果系统扣费,揭秘扣费... 你有没有遇到过这种情况?手机里突然多了一笔扣费,而且还是那种你完全没意识到的扣费?尤其是当你用的是安...
安卓系统智能电视刷机,焕新体验 亲爱的电视迷们,你是否曾为你的安卓智能电视的性能所困扰?是不是觉得它运行缓慢,功能受限?别担心,今天...