亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mlnet.cpp

?? 一個外國人寫的字符識別訓練源碼
?? CPP
字號:
/*
 Copyright (c) 2001 
 Author: Konstantin Boukreev 
 E-mail: konstantin@mail.primorye.ru 

 Created: 18.10.2001 16:30:36
 Version: 1.0.0

*/

#include "StdAfx.h"
#include "MLNet.h"

MLNet::MLNet(unsigned l_size, ...)
{
	set_transfer_function(0);
	set_minmax(.0, 1.);
	set_bias(1.);

	_ASSERTE(l_size >= 2); 
	
	m_layers.resize(l_size);

	unsigned number_of_weights = 0;
	unsigned t = 0;

	va_list arg;
	va_start(arg, l_size);
	for (unsigned i = 0; i < m_layers.size(); ++i)
	{
		m_layers[i] = va_arg(arg, unsigned);
		number_of_weights +=  (t * m_layers[i]);
		t = m_layers[i] + 1;	// add bias	
	}		
	va_end(arg);

	m_weights.resize(number_of_weights);
}

void MLNet::propagate(array_t& in_synapsis, array_t& out_axons)
{
	array_t::iterator  w = m_weights.begin();
	layers_t::iterator l = m_layers.begin();
	
	// an input layer
	_ASSERTE(in_synapsis.size() == *l);
	++l;

	// a second layer
	out_axons.resize(*l);
	propagate_layer(in_synapsis.begin(), in_synapsis.end(), out_axons.begin(), out_axons.end(), w);
	++l;
		
	// a next layers if any
	for (; l != m_layers.end(); ++l)
	{
		in_synapsis.swap(out_axons);
		out_axons.resize(*l);
		propagate_layer(in_synapsis.begin(), in_synapsis.end(), out_axons.begin(), out_axons.end(), w);
	}
		
	_ASSERTE(w == m_weights.end());
}

void MLNet::propagate_layer(array_t::iterator i_begin, array_t::iterator i_end,
		array_t::iterator o_begin, array_t::iterator o_end,	array_t::iterator& w)
{
	typedef array_t::iterator iterator;	
	array_t::value_type v;
	
	for (iterator o = o_begin; o != o_end; ++o)
	{				
		// bias		
		v = ((*w) * m_r * m_bias) / m_r;
		++w;
		
		for (iterator i = i_begin; i != i_end; ++i, ++w)		
		{		
			v += (((*i) * m_r) * ((*w) * m_r)) / m_r;					
		}		

		if (m_fn) 
		{		
			*o = m_fn(v);			// transfer function		
			_ASSERTE(*o >=  m_min);
			_ASSERTE(*o <=  m_max);
		}
		else *o = v;	
	}	
}

/////////////////////////////////////////////////////////


MLNet::Learn::Learn(MLNet& net, fn_derivative fd)
	: m_net(net), m_fd(fd)
{
	unsigned number_of_neurons = 0;
	for (layers_t::iterator l = (m_net.m_layers.begin() + 1); l != m_net.m_layers.end(); ++l)
		number_of_neurons += (*l);

	m_errors.resize(number_of_neurons);
	m_deltas.resize(m_net.m_weights.size());
}

void MLNet::Learn::propagate(array_t& in_synapsis, array_t& out_axons)
{
	// learn mode
	array_t::iterator  w = m_net.m_weights.begin();
	layers_t::iterator l = m_net.m_layers.begin();
	
	 // an input layer
	_ASSERTE(in_synapsis.size() == *l);
	++l;

	// a second layer
	out_axons.resize(*l);
	m_net.propagate_layer(in_synapsis.begin(), in_synapsis.end(), out_axons.begin(), out_axons.end(), w);
	++l;
	
	// a next layers if any
	array_t::iterator o_begin = out_axons.begin();
	array_t::iterator o_end   = out_axons.end();
	array_t::iterator i_begin, i_end;
	unsigned n_begin, n_end;
			
	for (; l != m_net.m_layers.end(); ++l)
	{	
		n_begin = o_begin  - out_axons.begin();
		n_end   = o_end	   - out_axons.begin();		
				
		out_axons.resize(out_axons.size() + *l);
					
		i_begin = out_axons.begin() + n_begin;
		i_end   = out_axons.begin() + n_end;
		o_begin = i_end;
		o_end   = out_axons.end();

		_ASSERTE(o_begin == (out_axons.begin() + out_axons.size() - *l));
				
		m_net.propagate_layer(i_begin, i_end, o_begin, o_end, w);
	}
	
	_ASSERTE(w == m_net.m_weights.end());
}

void MLNet::Learn::compute_errors(array_t& v_out, array_t& v_ideal)
{
	typedef array_t::reverse_iterator reverse_iterator;	

	reverse_iterator o = v_out.rbegin(); 
	reverse_iterator e = m_errors.rbegin(); 
	reverse_iterator w = m_net.m_weights.rbegin();

	// output layer
	for (reverse_iterator x = v_ideal.rbegin(); x != v_ideal.rend(); ++x, ++o, ++e)
	{	
		*e = ((*x) - (*o)) * m_fd(*o);
	//	*e = ((*o) - (*x)) * m_fd(*o);
	}

	// hidden layers
	
	typedef layers_t::reverse_iterator reverse_layer;
	reverse_layer l		= m_net.m_layers.rbegin();
	reverse_layer l_end = m_net.m_layers.rend();
		
	--l_end; // skips a input layer
	#ifdef _DEBUG
	unsigned l_input_size = *l_end;
	#endif // _DEBUG
			
	reverse_iterator ne_begin = m_errors.rbegin();
	reverse_iterator ne_end   = ne_begin + *l;
	
	unsigned nl_size = *l;
	++l;	// skips the output's layer too (already computed)

	for (; l != l_end; ++l)
	{	
		reverse_iterator te = e;		// remember the start of this layer
				
		// for every neuron into layer
		for (unsigned n = 0; n < *l; ++n, ++e, ++o, ++w)
		{			
			double dsum = .0;
			reverse_iterator nw = w;			
			for (reverse_iterator ne = ne_begin; ne != ne_end; ++ne)
			{
				dsum += ((*ne) * (*nw));
				nw += (*l + 1); // skip bias 
			}
			
			*e = value_t(dsum * m_fd(*o));
		}		
									
		ne_begin = te;
		ne_end   = ne_begin + *l;		

		// shift w		
		w += ((*l) + 1) * (nl_size - 1) + 1;
		nl_size = *l;
	}
	
	_ASSERTE(e == m_errors.rend());	
	_ASSERTE(o == v_out.rend());
	_ASSERTE(w == (m_net.m_weights.rend() - (l_input_size * nl_size + nl_size)));
}

void MLNet::Learn::compute_deltas(array_t& v_out, double M, double N)
{	
	typedef array_t::iterator iterator;	
	iterator e = m_errors.begin();
	iterator o = v_out.begin();
	iterator d = m_deltas.begin();

	typedef layers_t::iterator layer;
	layer l = m_net.m_layers.begin();
	unsigned pl_size = *l;
	++l; // skips a input layer
	
	for (; l != m_net.m_layers.end(); ++l)
	{					
		// for every neuron into layer 
		for (unsigned n = 0; n < *l; ++n, ++e)
		{
			// bias
			*d = delta(N, M, *d, *e, m_net.m_bias);			
			++d;

			iterator po = o;
			for (unsigned k = 0; k < pl_size; ++k, ++d, ++po)
			{			
				*d = delta(N, M, *d, *e, *po);
			}
		}		

		o += pl_size;
		pl_size = *l;		
	}

	_ASSERTE(e == m_errors.end());	
	_ASSERTE(o == v_out.end());
	_ASSERTE(d == m_deltas.end());
}

void MLNet::Learn::update()
{
	typedef array_t::iterator iterator;		
	iterator d = m_deltas.begin();

	for (iterator w = m_net.m_weights.begin(); w != m_net.m_weights.end(); ++w, ++d)
	{
		*w += *d;
	}

	_ASSERTE(d == m_deltas.end());
}

void MLNet::Learn::epoch(array_t& v_in, array_t& v_ideal, double N, double M)
{
	// in fact back-propagation	

	array_t v_out;	
	propagate(v_in, v_out);				
	compute_errors(v_out, v_ideal);
	v_out.insert(v_out.begin(), v_in.begin(), v_in.end());
	v_out.resize(v_out.size() - m_net.m_layers.back());
	compute_deltas(v_out, M, N);
	update();	
}

void MLNet::Learn::run(unsigned cycles, double N0, double N1, double M)
{
	randomize_weigths(- .25, .25);
	
	array_t v_in(m_net.m_layers.front());
	array_t v_ideal(m_net.m_layers.back());

	double dN = (N0 - N1) / cycles;	 
//	double tN = N0;

	for (unsigned i = 0; i < cycles; ++i)
	{		
		if (!get(0, i, v_in, v_ideal))
			return; // stop learning
		epoch(v_in, v_ideal, N0, M);

		_ASSERTE(v_in.size() == m_net.m_layers.front());
		_ASSERTE(v_ideal.size() == m_net.m_layers.back());
		
		#if 0		
		// is-c0nverged
		// change N
		if (N0 < tN  && 
			check_convergence(0.0001))
		{				
			tN = N0 * N0;
			N0 = sqrt(N0);
			if (cycles != i)
				dN = (N0 - N1) / (cycles - i);
		}
		#endif

		N0 -= dN;	
	}
}

void MLNet::Learn::randomize_weigths(float lo, float hi)
{	
	for (array_t::iterator i = m_net.m_weights.begin(); i != m_net.m_weights.end(); ++i)
	{
		*i = lo + ((float)rand() / RAND_MAX) * (hi - lo);
		_ASSERTE(*i >= lo);
		_ASSERTE(*i <= hi);
	}		
}

bool MLNet::Learn::check_convergence(double limit)
{		
	for (array_t::iterator d = m_deltas.begin(); d != m_deltas.end(); ++d)
	{
		if (fabs(*d) > limit) return false;
	}
	return true;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精选视频免费看| 亚洲一区二区三区中文字幕| 欧美日韩国产一级| 91福利在线看| 91久久国产最好的精华液| 91麻豆123| 91免费版在线看| 欧美区在线观看| 欧美色图12p| 欧美日韩国产免费| 欧美一区二区三区成人| 日韩欧美的一区二区| 精品国产电影一区二区| 国产日本亚洲高清| 日本一区二区三区四区| 中文字幕一区二区三区在线不卡 | 亚洲国产裸拍裸体视频在线观看乱了| 亚洲欧洲精品一区二区精品久久久| 国产精品久久久久7777按摩| 国产精品国产三级国产aⅴ原创 | 欧美丰满一区二区免费视频| 日韩一区二区免费高清| 久久久影院官网| 亚洲男同性恋视频| 青青草97国产精品免费观看| 国产福利91精品一区二区三区| 成人午夜激情影院| 色噜噜夜夜夜综合网| 日韩一级免费观看| 偷拍日韩校园综合在线| 蜜臀91精品一区二区三区| 狠狠色丁香久久婷婷综合_中| 成人福利视频在线| 欧美日韩在线综合| 国产日韩av一区| 亚洲 欧美综合在线网络| 国产高清无密码一区二区三区| 91网上在线视频| 久久婷婷色综合| 夜夜爽夜夜爽精品视频| 国产成人免费视| 欧美一级黄色片| 亚洲免费高清视频在线| 激情综合色综合久久| 欧美自拍偷拍一区| 国产精品美女一区二区在线观看| 婷婷国产v国产偷v亚洲高清| 波多野结衣的一区二区三区| 91精品在线观看入口| 亚洲欧美日韩成人高清在线一区| 狠狠色狠狠色合久久伊人| 欧美日韩免费在线视频| 中文字幕一区二区三区四区不卡| 久久97超碰国产精品超碰| 欧美色图免费看| 亚洲精品亚洲人成人网| www.视频一区| 国产日产欧美精品一区二区三区| 久久精品99久久久| 在线成人免费观看| 亚洲一区在线观看视频| 色欧美片视频在线观看| 中文字幕一区三区| 欧美在线视频日韩| 亚洲欧美综合色| 成人三级伦理片| 亚洲国产激情av| 国产白丝网站精品污在线入口| 欧美成人一区二区三区片免费| 亚洲va韩国va欧美va精品| 在线观看免费一区| 亚洲国产精品综合小说图片区| 一本到高清视频免费精品| 亚洲图片你懂的| 在线观看一区二区精品视频| 亚洲欧美激情小说另类| 色老汉一区二区三区| 亚洲综合激情网| 欧美精品在欧美一区二区少妇| 亚洲777理论| 日韩欧美区一区二| 韩国av一区二区三区在线观看| 精品国产一区二区三区四区四| 激情综合色综合久久综合| 久久亚洲综合色| 成人激情小说网站| 一个色在线综合| 91精品国产91综合久久蜜臀| 另类的小说在线视频另类成人小视频在线 | 亚洲成人一区二区| 337p亚洲精品色噜噜| 国产综合久久久久久久久久久久| 精品盗摄一区二区三区| 成人一道本在线| 亚洲乱码中文字幕| 欧美一卡2卡3卡4卡| 国产美女精品一区二区三区| 国产精品久久久久aaaa| 久久午夜老司机| 成人免费观看男女羞羞视频| 亚洲精品中文在线影院| 欧美唯美清纯偷拍| 韩国视频一区二区| 中文字幕视频一区| 91精品国产高清一区二区三区蜜臀| 精品在线播放免费| 中文字幕一区在线观看| 欧美一区二区在线视频| 国产.欧美.日韩| 亚洲国产精品人人做人人爽| 久久久一区二区三区| 色久综合一二码| 国产真实乱对白精彩久久| 亚洲图片激情小说| 精品国产免费一区二区三区香蕉| av一区二区久久| 美日韩黄色大片| 亚洲人被黑人高潮完整版| 日韩三级伦理片妻子的秘密按摩| eeuss国产一区二区三区| 日韩 欧美一区二区三区| 国产精品看片你懂得| 欧美一区二区日韩一区二区| 成人app下载| 激情综合色综合久久| 亚洲在线观看免费| 国产精品国产三级国产普通话99| 51精品视频一区二区三区| 99精品久久免费看蜜臀剧情介绍| 美国十次综合导航| 亚洲国产精品综合小说图片区| 欧美激情一区三区| 日韩欧美一二三| 欧美女孩性生活视频| 91麻豆国产精品久久| 成人app软件下载大全免费| 久久爱另类一区二区小说| 美女爽到高潮91| 亚洲成a人片综合在线| 成人免费一区二区三区视频| 国产日韩精品一区二区浪潮av| 日韩视频在线一区二区| 欧美日韩亚洲高清一区二区| 91久久一区二区| 97se狠狠狠综合亚洲狠狠| 成人黄色国产精品网站大全在线免费观看 | 久久伊99综合婷婷久久伊| 日韩一区二区在线观看| 3d成人动漫网站| 欧美精品电影在线播放| 欧美日韩亚洲综合在线| 欧美日韩电影一区| 欧美日韩国产片| 91精品国产一区二区人妖| 欧美精品一卡二卡| 91精品国产91久久综合桃花| 91精品国产综合久久福利| 91精品国产91久久久久久最新毛片| 欧美顶级少妇做爰| 欧美一级电影网站| 日韩女优av电影| 久久久久久亚洲综合| 国产视频一区二区三区在线观看| 久久女同精品一区二区| 欧美激情艳妇裸体舞| 国产精品乱码人人做人人爱| 亚洲视频一区在线| 亚洲成人资源在线| 欧美a级理论片| 国产高清无密码一区二区三区| 成人网在线免费视频| 色视频欧美一区二区三区| 欧美日韩精品电影| 26uuu精品一区二区在线观看| 国产三级精品三级| 一区二区欧美精品| 另类调教123区 | 欧美日韩国产成人在线免费| 欧美一区二区在线视频| 欧美国产日韩精品免费观看| 亚洲精品欧美综合四区| 国产成人精品三级麻豆| 色综合激情五月| 日韩欧美另类在线| 成人欧美一区二区三区小说| 亚洲国产精品一区二区www在线| 精品亚洲成a人| 在线中文字幕不卡| 久久综合色天天久久综合图片| 综合久久久久久| 蜜臀av性久久久久蜜臀aⅴ| av亚洲精华国产精华精华| 在线综合视频播放| 中文字幕免费观看一区| 性感美女极品91精品| 成人一区二区视频| 欧美一级爆毛片| 一区二区成人在线观看| 国产激情91久久精品导航| 欧美亚洲综合久久|