C++实现卷积和池化

用C++程序实现复杂表达式的计算问题 在很多数据结构的经典教材中提到了求解复杂表达式的问题,核心是堆栈的设计和算符优先级的设计。我用BCB6实现了这个问题,简单的谈一下我的思路。 Step-1:设计堆栈结构,双向链表。 Struct LinkingStack {       String  data;       LinkingStack   *front;   //前指针       LingkingSt 阅读详情

1、生成高斯核

Mat Gass_Kernel(float sigmma)
{
	Mat Kernel = Mat(Size(3, 3), CV_32FC1);
	float val_sum = 0.f;
	for (int i=0;i<3;i++)
		for (int j = 0; j < 3; j++)
		{
			float val = exp(-((i - 3/2)*(i - 3/2) + (j - 3/2)*(j - 3/2)) / (2 * sigmma*sigmma));
			Kernel.at<float>(i, j) = val;
			val_sum += val;
		}
	cout << Kernel << endl;
	cout << val_sum << endl;

	for (int i = 0; i<3; i++)
		for (int j = 0; j < 3; j++)
		{
			Kernel.at<float>(i, j) = Kernel.at<float>(i, j)/ val_sum;
		}
	return Kernel;

}

2、卷积

Mat Conv(Mat &map, Mat & kernel)
{
	int new_h =int((map.rows - kernel.rows)/1)+1;
	int new_w= int((map.cols - kernel.cols) /1) + 1;
	Mat new_mat = Mat(Size(new_h, new_w), map.depth());
	for (int i = 1; i < map.rows-1; i++)
	{
		for (int j = 1; j < map.cols - 1; j++)
		{

          //卷积计算
			float value = 0.f;
			for (int k_i=-1 ;k_i<=1 ;k_i++)
				for (int k_j = -1; k_j <= 1; k_j++)
				{
					value += kernel.at<uchar>(k_i + 1, k_j + 1)*map.at<uchar>(i + k_i, j + k_j);
				}
			new_mat.at<uchar>(i, j) = uchar(value);
		}
	}

	return new_mat;
}

3、池化

float getMax(Mat matrix, int kernel_size, int x, int y) {
	float max_value = matrix.at<uchar>(x,y);
	for (int i = 0; i < kernel_size; i++) {
		for (int j = 0; j < kernel_size; j++) {
			if (max_value < matrix.at<uchar>(x+i,y+j))
			{
				max_value = matrix.at<uchar>(x + i, y + j);
			}
		}
	}
	return max_value;
}

Mat Pool(Mat feat_mat,int kernel_size=3,int strides=2)
{
	int src_img_h = feat_mat.rows;
	int src_img_w= feat_mat.cols;
	int new_h = int((feat_mat.rows- kernel_size)/ strides+1);
	int new_w = int((feat_mat.cols - kernel_size) / strides + 1);
	printf("%d %d", new_h, new_w);
	Mat new_mat = Mat(Size(new_h, new_w), feat_mat.depth());
	for (int i = 0; i < new_mat.rows ; i++)
	{
		for (int j = 0; j < new_mat.cols; j++)
		{

			float gray_value = getMax(feat_mat, 3, i*strides, j*strides);
			new_mat.at<uchar>(i, j) = gray_value;

		}
	}

	return new_mat;


}

4、所有代码合起来

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/ml/ml.hpp>
#include <stdlib.h>
#include<ctime>  //时间
#include <map>
#include <cassert>
#include <direct.h>
#include <io.h>

using namespace std;
using namespace cv;

Mat Conv(Mat &map, Mat & kernel)
{
	int new_h =int((map.rows - kernel.rows)/1)+1;
	int new_w= int((map.cols - kernel.cols) /1) + 1;
	Mat new_mat = Mat(Size(new_h, new_w), map.depth());
	for (int i = 1; i < map.rows-1; i++)
	{
		for (int j = 1; j < map.cols - 1; j++)
		{

          //卷积计算
			float value = 0.f;
			for (int k_i=-1 ;k_i<=1 ;k_i++)
				for (int k_j = -1; k_j <= 1; k_j++)
				{
					value += kernel.at<uchar>(k_i + 1, k_j + 1)*map.at<uchar>(i + k_i, j + k_j);
				}
			new_mat.at<uchar>(i, j) = uchar(value);
		}
	}

	return new_mat;
}



Mat Gass_Kernel(float sigmma)
{
	Mat Kernel = Mat(Size(3, 3), CV_32FC1);
	float val_sum = 0.f;
	for (int i=0;i<3;i++)
		for (int j = 0; j < 3; j++)
		{
			float val = exp(-((i - 3/2)*(i - 3/2) + (j - 3/2)*(j - 3/2)) / (2 * sigmma*sigmma));
			Kernel.at<float>(i, j) = val;
			val_sum += val;
		}
	cout << Kernel << endl;
	cout << val_sum << endl;

	for (int i = 0; i<3; i++)
		for (int j = 0; j < 3; j++)
		{
			Kernel.at<float>(i, j) = Kernel.at<float>(i, j)/ val_sum;
		}
	return Kernel;

}



float getMax(Mat matrix, int kernel_size, int x, int y) {
	float max_value = matrix.at<uchar>(x,y);
	for (int i = 0; i < kernel_size; i++) {
		for (int j = 0; j < kernel_size; j++) {
			if (max_value < matrix.at<uchar>(x+i,y+j))
			{
				max_value = matrix.at<uchar>(x + i, y + j);
			}
		}
	}
	return max_value;
}

Mat Pool(Mat feat_mat,int kernel_size=3,int strides=2)
{
	int src_img_h = feat_mat.rows;
	int src_img_w= feat_mat.cols;
	int new_h = int((feat_mat.rows- kernel_size)/ strides+1);
	int new_w = int((feat_mat.cols - kernel_size) / strides + 1);
	printf("%d %d", new_h, new_w);
	Mat new_mat = Mat(Size(new_h, new_w), feat_mat.depth());
	for (int i = 0; i < new_mat.rows ; i++)
	{
		for (int j = 0; j < new_mat.cols; j++)
		{

			float gray_value = getMax(feat_mat, 3, i*strides, j*strides);
			new_mat.at<uchar>(i, j) = gray_value;

		}
	}

	return new_mat;


}
int main(int argc, char *argv[])
{
	Mat img = imread("./1/00.jpg",0);
	Mat save_img;

	Mat Feature_map=Gass_Kernel(1);
	save_img=Conv(img, Feature_map);
	save_img = Conv(img, Feature_map);
	save_img = Conv(img, Feature_map);
	save_img = Conv(img, Feature_map);
	Mat poolmat=Pool(save_img, 3, 2);
	cout << Feature_map << endl;
		
	imwrite("tesp.jpg", poolmat);
	system("pause");

	return 0;
}
void main_15()
{
	int i, j;
	double sigma = 1;
	const int N = 3;
	double gussian[N][N];
	double sum = 0.0;

	for (i = 0; i<N; i++)
	{
		for (j = 0; j<N; j++)
		{
			gussian[i][j] = exp(-((i - N / 2)*(i - N / 2) + (j - N / 2)*(j - N / 2)) / (2.0*sigma*sigma));
		
			printf("%f  ,", gussian[i][j]);

			sum += gussian[i][j];
		}
	}
	
	cout << sum << endl;

	for (i = 0; i<N; i++)
	{
		for (j = 0; j<N; j++)
		{
			gussian[i][j] = gussian[i][j] / sum;
			printf("%f  ,", gussian[i][j]);
		}
		printf("\n");
	}
}

 

用C++实现softmax函数(面试经验) 背景 今天面试字节算法岗时被问到的问题,让我用C++实现一个softmax函数。softmax是逻辑回归在多分类问题上的推广。大概的公式如下: input:{x1,x2,⋯ ,xn}softmax(xt)=ext∑i=1nexi input: \{x_1, x_2,\cdots, x_n\}\\ softmax(x_t)=\frac{e^{x_t}}{\sum_{i=1}^{n}e^{x_i}} input:{x1​,x2​,⋯,xn​}softmax(xt​)=∑i=1n​exi​ext​​ 即判断该变量 阅读详情

相关推荐

C++实现一维离散傅里叶变换

本文介绍如何用C++实现一维离散傅里叶变换(Discrete Fourier Transform)。 1. 一维傅里叶变换公式简介 如果读者对傅里叶变换的认识处于一知半解的程度,那么建议先阅读相关文章,例如网络上广泛流传的《如果看了此文你还不懂傅里叶变换,那就过来掐死我吧》,以加深理解。 一维连续傅里叶变换的公式表达如下: 经过离散化后,上述公式变为: 其中M为x的个

ShadowN1ght的博客 1万+

序列卷积之和

题目:序列卷积之和 题解:这题打表找规律,然后用前缀和。 每对i*j出现了多少对。 第一行相当于(a[1]*4+a[2]*3+a[3]*2+a[4]*1)*1 第二行相当于(a[2]*3+a[3]*2+a[4]*1)*2 第三行相当于(a[3]*2+a[4]*1)*3 … #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int>P; const int inf =

多一些不为什么的坚持 1580

Vivado HLS实现卷积和池化操作

Vivado HLS实现卷积和池化操作

Legendyyy的博客 2035

浅谈卷积和C++实现

1 信号处理中的卷积 无论是信号处理、图像处理还是其他一些领域,我们经常会在一些相互关联的数据处理中使用卷积。卷积可以说是算法中一个非常重要的概念。这个概念最早起源于信号处理之中。 假设对于一个线性系统其在单位脉冲δ(t)的响应下,输出为h(t).那么在Aδ(t)的响应下输出为Ah(t).而所有的信号都可以用δ(t)乘以一个系数的和来表示。即 .于是对于线性系统而言,我们可以将当前及过去所有时刻...

weixin_34074740的博客 1612

C++中的深度学习应用:实现卷积神经网络(CNN)

🏆本文收录于「编程与技术实战」专栏,此专栏涵盖了C/C++编程、人工智能、数据结构、机器学习等技术领域的内容,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 1282

Convolution and Max Pooling of CNN (卷积和池化的实现)

Convolution and Max Pooling of CNN (卷积和池化的实现) 卷积和池化的具体解释(比较清晰直观): http://www.hackcv.com/index.php/archives/104/?hmsr=toutiao.io&amp;utm_medium=toutiao.io&amp;utm_source=toutiao.io 图像卷积的实现 图像卷积的原理图...

shuiliusheng的专栏 854

C++创建一个卷积神经网络

实现卷积神经网络(CNN)在 C++ 中是一个相对复杂的任务,通常需要处理多个组件,包括卷积层、池化层、激活函数、损失函数,以及反向传播的优化算法。为了便于理解,提供一个简化的 CNN 实现,使用基础的卷积和池化操作。

ic_design11的博客 1438

CNN编程实践: C++实现LeNet-5全记录

后期需要用FPGA实现神经网络的硬件加速,开发语言准备选择C++,由于是初学者,需找一不是很复杂的网络进行学习,故尝试对CNN经典网络LeNet-5进行分析和C++语言实现。 一、论文解析 LeNet-5 由LeCun于1998年提出,论文全篇共43页,非常详细的对CNN和LeNet进行了说明,本文仅对部分内容进行分析 1 LeNet-5 网络结构 上图是LeNet-5的网络结构,计输入层和输出层共计为8层: input layer --> 输入层(图中INPUT) convulatio.

weixin_44600457的博客 3178

卷积神经网络原理及其C++/Opencv实现(6)—前向传播代码实现

在以上文章中,我们基本把5层网络的原理、公式推导讲过了,从本文开始,我们来讲一下基于C++和Opencv的5层卷积神经网络实现吧~需要注意的是,在卷积神经网络中,我们说的卷积运算其实是互相关运算,也即开始卷积运算之前卷积核不需要做顺时针180°的旋转。以下函数中,vec1和vec2是两个长度相同的一维向量,点乘的结果就是它们对应位置的值相乘,然后把所有乘积相加的结果。好了,本文就讲到这里,接下来的文章我们来讲反向传播的实现和参数更新的实现,敬请期待~...

生活需要深度 826

卷积神经网络应用实例,卷积神经网络实际应用

border_mode可以是valid或者full,具体看这里说明:.conv2d#激活函数用tanh#你还可以在(Activation('tanh'))后加上dropout的技巧: (Dropout(0.5))(Convolution2D(4, 5, 5, border_mode='valid',input_shape=(1,28,28))) (Activation('tanh'))#第二个卷积层,8个卷积核,每个卷积核大小3*3。同时,图像预处理的好坏也会影响到提取的特征。

kfc67269的博客 3284

C++实现卷积神经网络CNN

以上代码中,我们定义了一个卷积神经网络,包括两个卷积层、两个池化层和两个全连接层,以及一个均方误差损失函数。通过这些代码,读者可以了解卷积神经网络的基本组成部分和训练流程,深入理解深度学习中的卷积神经网络。卷积层通过滑动窗口的方式对输入数据进行卷积操作,提取出局部特征,并把特征映射到下一个卷积层或池化层中。下面,我们将给出C++实现卷积神经网络的完整代码,该代码包括了卷积层、池化层、全连接层以及损失函数等组件。首先,我们定义了一个称为"Layer"的基类,用于表示网络中的各种层。C++实现卷积神经网络。

CodeLancerX的博客 887

C++ 卷积神经网络

C++卷积神经网络

qq_42877866的博客 3092

C++实现卷积神经网络(CNN)- 详细教程及源代码

在这个例子中,我们假设输入数据和卷积核都是二维的,并且输入数据和输出数据都是以行优先的方式存储。函数的输入参数包括输入数据指针、卷积核指针、输出数据指针、输入数据的尺寸和卷积核的尺寸。函数的输入参数包括输入数据指针、权重指针、偏置指针、输出数据指针、输入数据的大小和输出数据的大小。函数的输入参数包括输入数据指针、输出数据指针、输入数据的尺寸和池化的尺寸。在这个例子中,我们定义了一个3x3的输入数据,一个2x2的卷积核,然后进行卷积操作、池化操作和全连接操作,并输出最终的结果。希望这篇文章对你有帮助!

DevPulse的博客 1563

C++实现卷积神经网络CNN(附带源码)

卷积神经网络(Convolutional Neural Network, CNN)是一种深度学习模型,广泛应用于 图像识别、目标检测、语音识别等任务。CNN 通过卷积层、池化层、全连接层等结构来提取图像中的特征,并进行分类或回归预测。

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1443

C++实现卷积神经网络(CNN)项目实战

卷积神经网络(Convolutional Neural Network, CNN)是一种专为处理具有类似网格结构的数据(如图像)而设计的深度学习模型。其核心思想是通过局部感受野、权值共享和池化操作来自动提取图像的层次化特征,从而显著降低参数数量并提升模型泛化能力。与传统全连接神经网络相比,CNN在图像识别任务中展现出更强的表达能力和更高的效率。

weixin_42234168的博客 748

C++ 和 OpenCV 实现 Keras Sequential 网络

C++ 和 OpenCV 实现 Keras Sequential 网络 从 HDF5 文件中读取 Keras 定义的 model, 并自动生成 model 中定义的网络, 加载 Keras 训练好的参数进行预测

Mr-MegRob 701

探索深度学习新境界:基于C++的卷积神经网络开源项目

探索深度学习新境界:基于C++的卷积神经网络开源项目 【下载地址】基于C实现卷积神经网络 本仓库提供了一个基于C++实现的卷积神经网络(Convolutional Neural Network, CNN)资源文件。该资源文件通过C++底层代码构建,初步实现了卷积神经网络的基本功能 ...

gitblog_09746的博客 979

C++构建基础卷积神经网络实战

获取数据集是开始任何机器学习或深度学习项目的第一步。有许多开源数据集可用于训练和测试CNN模型。以下是一些广泛使用和参考的图像数据集:MNIST:一个手写数字的大型数据库,包含60,000个训练样本和10,000个测试样本,每个样本都是28x28像素的灰度图像。CIFAR-10:由60,000个32x32彩色图像组成的10类数据集,每类包含6,000个图像。ImageNet:包含数百万标记图像,分布在数千个类别中,是研究界广泛认可的大型数据集。

weixin_36064575的博客 1041
上一篇: 二维高斯函数应用于图像处理
下一篇: Pycharm调试时按F8单步调试失灵解决方法
LiBin1103
博客等级 码龄9年 38粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值