(3)、S4層:計(jì)算S4層神經(jīng)元誤差、C5層權(quán)值誤差、C5層閾值誤差;通過(guò)C5層權(quán)值乘以C5層神經(jīng)元誤差,求和,結(jié)果再乘以S4層神經(jīng)元的tanh激活函數(shù)的導(dǎo)數(shù),獲得S4層每一個(gè)神經(jīng)元誤差;通過(guò)S4層神經(jīng)元乘以C5層神經(jīng)元誤差,求和,獲得C5層權(quán)值誤差;C5層神經(jīng)元誤差即為C5層閾值誤差。
(4)、C3層:計(jì)算C3層神經(jīng)元誤差、S4層權(quán)值誤差、S4層閾值誤差;
(5)、S2層:計(jì)算S2層神經(jīng)元誤差、C3層權(quán)值誤差、C3層閾值誤差;
(6)、C1層:計(jì)算C1層神經(jīng)元誤差、S2層權(quán)值誤差、S2層閾值誤差;
(7)、輸入層:計(jì)算C1層權(quán)值誤差、C1層閾值誤差.
代碼文件:
CNN.hpp:
#ifndef _CNN_HPP_
#define _CNN_HPP_
#include
#include
namespace ANN {
#define width_image_input_CNN 32 //歸一化圖像寬
#define height_image_input_CNN 32 //歸一化圖像高
#define width_image_C1_CNN 28
#define height_image_C1_CNN 28
#define width_image_S2_CNN 14
#define height_image_S2_CNN 14
#define width_image_C3_CNN 10
#define height_image_C3_CNN 10
#define width_image_S4_CNN 5
#define height_image_S4_CNN 5
#define width_image_C5_CNN 1
#define height_image_C5_CNN 1
#define width_image_output_CNN 1
#define height_image_output_CNN 1
#define width_kernel_conv_CNN 5 //卷積核大小
#define height_kernel_conv_CNN 5
#define width_kernel_pooling_CNN 2
#define height_kernel_pooling_CNN 2
#define size_pooling_CNN 2
#define num_map_input_CNN 1 //輸入層map個(gè)數(shù)
#define num_map_C1_CNN 6 //C1層map個(gè)數(shù)
#define num_map_S2_CNN 6 //S2層map個(gè)數(shù)
#define num_map_C3_CNN 16 //C3層map個(gè)數(shù)
#define num_map_S4_CNN 16 //S4層map個(gè)數(shù)
#define num_map_C5_CNN 120 //C5層map個(gè)數(shù)
#define num_map_output_CNN 10 //輸出層map個(gè)數(shù)
#define num_patterns_train_CNN 60000 //訓(xùn)練模式對(duì)數(shù)(總數(shù))
#define num_patterns_test_CNN 10000 //測(cè)試模式對(duì)數(shù)(總數(shù))
#define num_epochs_CNN 100 //最大迭代次數(shù)
#define accuracy_rate_CNN 0.985 //要求達(dá)到的準(zhǔn)確率
#define learning_rate_CNN 0.01 //學(xué)習(xí)率
#define eps_CNN 1e-8
#define len_weight_C1_CNN 150 //C1層權(quán)值數(shù),5*5*6*1=150
#define len_bias_C1_CNN 6 //C1層閾值數(shù),6
#define len_weight_S2_CNN 6 //S2層權(quán)值數(shù),1*6=6
#define len_bias_S2_CNN 6 //S2層閾值數(shù),6
#define len_weight_C3_CNN 2400 //C3層權(quán)值數(shù),5*5*16*6=2400
#define len_bias_C3_CNN 16 //C3層閾值數(shù),16
#define len_weight_S4_CNN 16 //S4層權(quán)值數(shù),1*16=16
#define len_bias_S4_CNN 16 //S4層閾值數(shù),16
#define len_weight_C5_CNN 48000 //C5層權(quán)值數(shù),5*5*16*120=48000
#define len_bias_C5_CNN 120 //C5層閾值數(shù),120
#define len_weight_output_CNN 1200 //輸出層權(quán)值數(shù),120*10=1200
#define len_bias_output_CNN 10 //輸出層閾值數(shù),10
#define num_neuron_input_CNN 1024 //輸入層神經(jīng)元數(shù),32*32=1024
#define num_neuron_C1_CNN 4704 //C1層神經(jīng)元數(shù),28*28*6=4704
#define num_neuron_S2_CNN 1176 //S2層神經(jīng)元數(shù),14*14*6=1176
#define num_neuron_C3_CNN 1600 //C3層神經(jīng)元數(shù),10*10*16=1600
#define num_neuron_S4_CNN 400 //S4層神經(jīng)元數(shù),5*5*16=400
#define num_neuron_C5_CNN 120 //C5層神經(jīng)元數(shù),1*120=120
#define num_neuron_output_CNN 10 //輸出層神經(jīng)元數(shù),1*10=10
class CNN {
public:
CNN();
~CNN();
void init(); //初始化,分配空間
bool train(); //訓(xùn)練
int predict(const unsigned char* data, int width, int height); //預(yù)測(cè)
bool readModelFile(const char* name); //讀取已訓(xùn)練好的BP model
protected:
typedef std::vector wi_connections;
typedef std::vector wo_connections;
typedef std::vector io_connections;> 16) & 255;
ch4 = (i >> 24) & 255;
return((int)ch1 << 24) + ((int)ch2 << 16) + ((int)ch3 << 8) + ch4;
}
static void readMnistImages(std::string filename, double* data_dst, int num_image)
{
const int width_src_image = 28;
const int height_src_image = 28;
const int x_padding = 2;
const int y_padding = 2;
const double scale_min = -1;
const double scale_max = 1;
std::ifstream file(filename, std::ios::binary);
assert(file.is_open());
int magic_number = 0;
int number_of_images = 0;
int n_rows = 0;
int n_cols = 0;
file.read((char*)&magic_number, sizeof(magic_number));
magic_number = reverseInt(magic_number);
file.read((char*)&number_of_images, sizeof(number_of_images));
number_of_images = reverseInt(number_of_images);
assert(number_of_images == num_image);
file.read((char*)&n_rows, sizeof(n_rows));
n_rows = reverseInt(n_rows);
file.read((char*)&n_cols, sizeof(n_cols));
n_cols = reverseInt(n_cols);
assert(n_rows == height_src_image && n_cols == width_src_image);
int size_single_image = width_image_input_CNN * height_image_input_CNN;
for (int i = 0; i < number_of_images; ++i) {
int addr = size_single_image * i;
電子發(fā)燒友App










評(píng)論