1. 程式人生 > >c++實現卷積過程

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_