C++元编程——多通道CNN实现(2)

之前设计的CNN有点问题,与传统的CNN有较大的差距。传统CNN不需要权重层的输出,下面就展示详细的实现。首先还是测试程序:

#include "cnn.hpp"

int main(int argc, char** argv) 
{
	using cnn_type = cnn <
		nadam, sigmoid, XavierGaussian		// 判别层使用的更新方法、激活函数和初始化方法
		, 3, 64, 64, 4						// 3通道、64*64图像、4输出的判别层
		, nadam, ReLu, XavierGaussian	    // 卷积池化层使用的更新方法、激活函数和初始化方法
		, 5									// 5卷积核
		, 8, 8							    // 卷积核尺寸
		, 4, 4								// 卷积核步幅
		, 2, 2								// 池化层尺寸

		, 5									// 5卷积核
		, 4, 4							    // 卷积核尺寸
		, 2, 2								// 卷积核步幅
		, 2, 2								// 池化层尺寸

		, 5									// 3卷积核
		, 2, 2								// 卷积核尺寸
		, 1, 1								// 卷积核步幅
		, 2, 2								// 池化层尺寸
	>;
	
	cnn_type cnn_layer;

	cnn_type::input_type mti(.4);
	cnn_type::ret_type mto(.8);
	weight_initilizer::cal(mti, 0., 1.);
	weight_initilizer::cal(mto, 0, 1);

	for (int i = 0; ; ++i)
	{
		auto mtok = cnn_layer.forward(mti);
		cnn_layer.backward(mtok - mto);
		if (i

你可能感兴趣的:(元编程学习实践,c++,cnn,深度学习)