我计划将Nguyen-Widrow算法用于具有多个隐藏层的NN。在研究过程中,我发现了很多含糊之处,我希望澄清它们。
以下是Nguyen-Widrow算法的伪代码
Initialize all weight of hidden layers with random values
For each hidden layer{
beta = 0.7 * Math.pow(hiddenNeurons, 1.0 / number of inputs);
For each synapse{
For each weight{
Adjust weight by dividing by norm of weight for neuron and * multiplying by beta value
}
}
}
只是想澄清hiddenNeurons的值是否是特定隐藏层的大小,或者网络中所有隐藏层的大小。我通过查看各种来源混淆了。< / p>
换句话说,如果我有一个网络(3-2-2-2-3)(索引0是输入层,索引4是输出层),值hiddenNeurons是:
NumberOfNeuronsInLayer(1) + NumberOfNeuronsInLayer(2) + NumberOfNeuronsInLaer(3)
或者只是
NumberOfNeuronsInLayer(i),其中i是我目前的第一层
编辑:
那么,hiddenNeurons值是当前隐藏层的大小,输入值是前一个隐藏层的大小?
答案 0 :(得分:3)
Nguyen-Widrow 初始化算法如下:
答案 1 :(得分:2)
听起来像你想要更精确的代码。以下是我参与的项目中的一些实际代码行。希望你阅读C.它有点抽象和简化。有一个struct nn
,它包含神经网络数据。您可能拥有自己的抽象数据类型。
我项目的代码行(稍微简化):
float *w = nn->the_weight_array;
float factor = 0.7f * powf( (float) nn->n_hidden, 1.0f / nn->n_input);
for( w in all weight )
*w++ = random_range( -factor, factor );
/* Nguyen/Widrow */
w = nn->the_weight_array;
for( i = nn->n_input; i; i-- ){
_scale_nguyen_widrow( factor, w, nn->n_hidden );
w += nn->n_hidden;
}
调用的函数:
static void _scale_nguyen_widrow( float factor, float *vec, unsigned int size )
{
unsigned int i;
float magnitude = 0.0f;
for ( i = 0; i < size; i++ )
magnitude += vec[i] * vec[i];
magnitude = sqrtf( magnitude );
for ( i = 0; i < size; i++ )
vec[i] *= factor / magnitude;
}
static inline float random_range( float min, float max)
{
float range = fabs(max - min);
return ((float)rand()/(float)RAND_MAX) * range + min;
}
提示强>
在实现Nguyen / Widrow权重初始化之后,您实际上可以在正向计算中添加一些代码行,将每个激活转储到文件中。然后你可以检查一组神经元击中激活函数的程度。找出平均值和标准差。你甚至可以用绘图工具绘制它,即。 gnuplot的。 (你需要一个像gnuplot这样的绘图工具来绘制错误率等等。)我为我的实现做了那个。情节很好,使用Nguyen / Widrow为我的项目开始学习的速度要快得多。
PS:根据Nguyen和Widrows的意图,我不确定我的实施是否正确。我甚至不认为我关心,只要它确实改善了初步学习。
祝你好运,