c++實現卷積過程
直接上程式碼:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
//定義被卷積的矩陣(其實是一個數組,陣列元素的個數8*8)
int const map = 8;
float A[map*map] =
{
1, 2, 3, 4, 5, 6, 7, 8,
1, 2, 3, 4, 5, 6, 7, 8,
1, 2, 3, 4, 5, 6, 7, 8,
1, 2, 3, 4, 5, 6, 7 , 8,
1, 2, 3, 4, 5, 6, 7, 8,
1, 2, 3, 4, 5, 6, 7, 8,
1, 2, 3, 4, 5, 6, 7, 8,
1, 2, 3, 4, 5, 6, 7, 8
};
//定義卷積核矩陣(其實也是一個數組,陣列元素的個數3*3)
int const kernel = 3;
float B[kernel*kernel] =
{
1, 1, 1,
1, 1, 1,
1, 1, 1
};
//計算卷積輸出矩陣的維數(其實是輸出陣列元素個數的開根號)
int const outm = map - kernel + 1; //被卷積矩陣的維數-卷積核的維數+1 即8-3+1=6
//計算卷積過程中的被卷積矩陣的寬和高(就是把寬拉成和卷積核的高一樣,這樣才好對應相乘)
int const convAw = kernel*kernel;//3*3=9
int const convAh = map*map;//8*8=64
float A_convert[convAh*convAw] = { 0 };//定義一個卷積過程中的矩陣(也就是被拉長過後的矩陣)
for (int i = 0; i < outm; i++)
{
for (int j = 0; j < outm; j++)
{
int wh = i * outm * convAw + j * convAw;
int col1 = i * map + j;
A_convert[wh] = A[col1]; //第一次迴圈時把A[0] 的值賦給 A_convert[0]
A_convert[wh + 1] = A[col1 + 1];//第一次迴圈時把A[1] 的值賦給 A_convert[1]
A_convert[wh + 2] = A[col1 + 2];//第一次迴圈時把A[2] 的值賦給 A_convert[2]
int col2 = (i + 1) * map + j;
A_convert[wh + 3] = A[col2]; //第一次迴圈時把A[8] 的值賦給 A_convert[3]
A_convert[wh + 4] = A[col2 + 1];//第一次迴圈時把A[9] 的值賦給 A_convert[4]
A_convert[wh + 5] = A[col2 + 2];//第一次迴圈時把A[10] 的值賦給 A_convert[5]
int col3 = (i + 2) * map + j;
A_convert[wh + 6] = A[col3]; //第一次迴圈時把A[16] 的值賦給 A_convert[6]
A_convert[wh + 7] = A[col3 + 1]; //第一次迴圈時把A[17] 的值賦給 A_convert[7]
A_convert[wh + 8] = A[col3 + 2]; //第一次迴圈時把A[18] 的值賦給 A_convert[8]
}
}
vector<int> C;
for (int i = 0; i < outm; i++)
{
for (int j = 0; j < outm; j++)
{
int a = 0;
int wh = i * outm * convAw + j * convAw;
for (int m =0; m < convAw; m++)
{
a += A_convert[wh + m] * B[m] ;
}
C.push_back(a); //在C中新增資料a
}
}
//輸出被卷積矩陣
cout << "被卷積矩陣 :" << endl;
for (int i = 0; i < map; i++)
{
for (int j = 0; j < map; j++)
{
cout << A[i*map + j] << " ";
}
cout << endl;
}
cout << endl;
//輸出卷積核矩陣
cout << "卷積核矩陣:" << endl;
for (int i = 0; i < kernel; i++)
{
for (int j = 0; j < kernel; j++)
{
cout << B[i*kernel + j] << " ";
}
cout << endl;
}
cout << endl;
//輸出卷積後輸出矩陣
cout << "卷積後輸出矩陣:" << endl;
for (int i = 0; i < outm; i++)
{
for (int j = 0; j < outm; j++)
{
cout << C[i*outm + j] << " ";
}
cout << endl;
}
system("pause");
return 0;
}
相關推薦
c++實現卷積過程
直接上程式碼: #include<iostream> #include<vector> using namespace std; int main() { //定義被卷積的矩陣(其實是一個數組,陣列元素的個數8*8)
C語言實現卷積程式碼
C語言實現一維卷積程式碼(失敗)待修改 #include<iostream> using namespace std; int main() { int i,j,k,n,m,a[n],b[m],c[n+m-1]; cout<<"輸入n:"; cin>>n
多通道(比方RGB三通道)卷積過程
borde caff 一個 特征 結構 load 核數 alt log 今天一個同學問 卷積過程好像是對 一個通道的圖像進行卷積, 比方10個卷積核,得到10個feature map, 那麽輸入圖像為RGB三個通道呢,輸出就為 30個feature map 嗎, 答
RGB彩圖卷積過程
轉載自:http://lib.csdn.net/article/aimachinelearning/42986 在CNN中,濾波器filter(帶著一組固定權重的神經元)對區域性輸入資料進行卷積計算。每計算完一個數據視窗內的區域性資料後,資料視窗不斷平移滑動,直到計算完所有資料。這個過程中,有這
字元型圖片驗證碼,使用tensorflow實現卷積神經網路,進行驗證碼識別CNN
本專案使用卷積神經網路識別字符型圖片驗證碼,其基於 TensorFlow 框架。它封裝了非常通用的校驗、訓練、驗證、識別和呼叫 API,極大地減低了識別字符型驗證碼花費的時間和精力。 專案地址: https://github.com/nickliqian/cnn_captcha
利用Python實現卷積神經網路的視覺化(附Python程式碼)
對於深度學習這種端到端模型來說,如何說明和理解其中的訓練過程是大多數研究者關注熱點之一,這個問題對於那種高風險行業顯得尤為重視,比如醫療、軍事等。在深度學習中,這個問題被稱作“黑匣子(Black Box)”。如果不能解釋模型的工作過程,我們怎麼能夠就輕易相信模型的輸出結果呢? 以深度學習模型檢測
【深度學習】基於im2col的展開Python實現卷積層和池化層
一、回顧 上一篇 我們介紹了,卷積神經網的卷積計算和池化計算,計算過程中視窗一直在移動,那麼我們如何準確的取到視窗內的元素,並進行正確的計算呢? 另外,以上我們只考慮的單個輸入資料,如果是批量資料呢? 首先,我們先來看看批量資料,是如何計算的 二、批處理 在神經網路的
CNN 的卷積過程為什麼 要將卷積核旋轉180°
CNN(卷積神經網路)的誤差反傳(error back propagation)中有一個非常關鍵的的步驟就是將某個卷積(Convolve)層的誤差傳到前一層的池化(Pool)層上,因為在CNN中是2D反傳,與傳統神
java 程式碼實現卷積計算
簡單的寫一下卷積到底是一個什麼計算過程。 假設有一個卷積核h,就一般為3*3的矩陣: 有一個待處理矩陣x: h*x的計算過程分為三步 第一步,將卷積核翻轉180°,也就是成為了 第二步,將卷積核h的中心對準x的第一個元素,然後對應元素相乘後相加,沒有元素的地方補
[深度學習] Python實現卷積神經網路- Convolution
[深度學習] Python實現卷積神經網路- Convolution 作者 sunsided github 地址: https://github.com/sunsided/python-conv2d import cv2 import numpy as np # load the
基於cifar10實現卷積神經網路影象識別
1 import tensorflow as tf 2 import numpy as np 3 import math 4 import time 5 import cifar10 6 import cifar10_input 7 """ 8 Create
Tensorflow實現卷積神經網路
如果不明白什麼是卷積神經網路,請參考:計算機視覺與卷積神經網路 下面基於開源的實現簡單梳理如何用tensorflow實現卷積神經網路. 實現卷積神經網路 載入資料集 # 載入資料集 impor
TensorFlow學習筆記(5)--實現卷積神經網路(MNIST資料集)
這裡使用TensorFlow實現一個簡單的卷積神經網路,使用的是MNIST資料集。網路結構為:資料輸入層–卷積層1–池化層1–卷積層2–池化層2–全連線層1–全連線層2(輸出層),這是一個簡單但非常有代表性的卷積神經網路。 import tensorflow
機器學習筆記:tensorflow實現卷積神經網路經典案例--識別手寫數字
從識別手寫數字的案例開始認識神經網路,並瞭解如何在tensorflow中一步步建立卷積神經網路。 安裝tensorflow 資料來源 kaggle新手入門的數字識別案例,包含手寫0-9的灰度值影象的csv檔案,下載地址:https://www.
深度學習筆記5-tensorflow實現卷積神經網路
深度學習筆記5-tensorflow實現卷積神經網路 在股票等預測模型中,可以從原始資料提取金融因子等特徵。而影象則無有效特徵,只能藉助SIFT、HOG等提取有效特徵,再集合SVM等機器學習演算法進行影象識別。卷積神經網路(CNN)提取的特徵則可以達到更好的效果,同時它不需要將特徵提取和
手動實現卷積神經網路中的卷積操作(conv2d)
寫這個的原因:一來好像沒怎麼搜到別人手動實現,作為補充;二來鞏固一下基礎。 卷積操作示意 先從一張示意圖說起,卷積基礎概念和操作步驟就不囉嗦了,只講這張圖,大意就是,有in-channel,有out-channel,你需要把in-channel都做卷積操作,然
Pytorch實現卷積神經網路CNN
Pytorch是torch的Python版本,對TensorFlow造成很大的衝擊,TensorFlow無疑是最流行的,但是Pytorch號稱在諸多效能上要優於TensorFlow,比如在RNN的訓練上,所以Pytorch也吸引了很多人的關注。之前有一篇關於TensorF
【Deep Learning】tensorflow實現卷積神經網路(AlexNet)
一、實驗要求 1.使用卷積神經網路實現圖片分類,資料集為OxFlowers17; 二、實驗環境 Anaconda2-4.3.1(Python2.7),tensorflow-cpu。 三、實驗原理 3.1 資料讀取 已知資料集
Keras上實現卷積神經網路CNN——一個例子程式
一、概述及完整程式碼 本例的程式碼主要來自keras自帶的example裡的 mnist_cnn 模組,主要用到keras.layers中的Dense, Dropout, Activation, Flatten模組和keras.layers中的Convolut
tensorflow實現卷積神經網(CNN),還加了個dropout
來自<Tensorflow實戰>一書 # 兩個卷積 一個全連線層 from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf mnist = input_