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;
}

相关内容

热门资讯

【MySQL】锁 锁 文章目录锁全局锁表级锁表锁元数据锁(MDL)意向锁AUTO-INC锁...
【内网安全】 隧道搭建穿透上线... 文章目录内网穿透-Ngrok-入门-上线1、服务端配置:2、客户端连接服务端ÿ...
GCN的几种模型复现笔记 引言 本篇笔记紧接上文,主要是上一篇看写了快2w字,再去接入代码感觉有点...
数据分页展示逻辑 import java.util.Arrays;import java.util.List;impo...
Redis为什么选择单线程?R... 目录专栏导读一、Redis版本迭代二、Redis4.0之前为什么一直采用单线程?三、R...
【已解决】ERROR: Cou... 正确指令: pip install pyyaml
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
Lock 接口解读 前置知识点Synchronized synchronized 是 Java 中的关键字,...
Win7 专业版安装中文包、汉... 参考资料:http://www.metsky.com/archives/350.htm...
3 ROS1通讯编程提高(1) 3 ROS1通讯编程提高3.1 使用VS Code编译ROS13.1.1 VS Code的安装和配置...
大模型未来趋势 大模型是人工智能领域的重要发展趋势之一,未来有着广阔的应用前景和发展空间。以下是大模型未来的趋势和展...
python实战应用讲解-【n... 目录 如何在Python中计算残余的平方和 方法1:使用其Base公式 方法2:使用statsmod...
学习u-boot 需要了解的m... 一、常用函数 1. origin 函数 origin 函数的返回值就是变量来源。使用格式如下...
常用python爬虫库介绍与简... 通用 urllib -网络库(stdlib)。 requests -网络库。 grab – 网络库&...
药品批准文号查询|药融云-中国... 药品批文是国家食品药品监督管理局(NMPA)对药品的审评和批准的证明文件...
【2023-03-22】SRS... 【2023-03-22】SRS推流搭配FFmpeg实现目标检测 说明: 外侧测试使用SRS播放器测...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
初级算法-哈希表 主要记录算法和数据结构学习笔记,新的一年更上一层楼! 初级算法-哈希表...
进程间通信【Linux】 1. 进程间通信 1.1 什么是进程间通信 在 Linux 系统中,进程间通信...
【Docker】P3 Dock... Docker数据卷、宿主机与挂载数据卷的概念及作用挂载宿主机配置数据卷挂载操作示例一个容器挂载多个目...