我正在使用Keras生成一个简单的单层前馈网络.我想通过kernel_initializer参数初始化权重时更好地处理权重值.有没有办法可以在初始化之后(即在训练完成之前)查看权重值.
如果您需要更多信息,请告诉我.干杯
编辑1:也许我应该解释为什么我想要看到初始化的权重.在Keras,我对随机正交矩阵的实际外观感到有些困惑.如果我可以打印这些值,它将有助于我更好地理解这个功能.
编辑2:在创建模型之后但在适合之前使用get_weights不起作用.无论kernel_initializer使用何种情况,返回的权重始终为零.
编辑3:我在编辑2中所说的不正确.请参阅选定的答案以获得澄清.
在Keras中运行神经网络时,我似乎找不到太多有关如何解释get_weights()输出的文档。据我了解,输出取决于网络的结构。因此,我在下面粘贴了网络结构的简化版本:
model.add(Dense(5, input_dim=2, activation = linear, use_bias=True, kernel_initializer=Orthogonal))
model.add(Dense(1, use_bias=True))
model.compile(loss='mae', optimizer='adam')
Run Code Online (Sandbox Code Playgroud)
训练后的get_weights()输出为:
[array([[ 0.79376745, 0.79879117, 1.22406125, 1.07782006, 1.24107373],
[ 0.88034034, 0.88281095, 1.13124955, 0.98677355, 1.14481246]], dtype=float32),
array([-0.09109745, -0.09036621, 0.0977743 , -0.07977977, 0.10829113], dtype=float32),
array([[-0.72631335],
[-0.38004425],
[ 0.62861812],
[ 0.10909595],
[ 0.30652359]], dtype=float32),
array([ 0.09278722], dtype=float32)]
Run Code Online (Sandbox Code Playgroud)
共有四个数组。每个代表什么?谢谢!
我正在尝试编写一些逻辑来选择在 Keras 中运行神经网络的最佳纪元。我的代码保存一定数量的历元的训练损失和测试损失,然后根据某种逻辑选择最合适的历元。代码如下所示:
ini_epochs = 100
df_train_loss = DataFrame(data=history.history['loss'], columns=['Train_loss']);
df_test_loss = DataFrame(data=history.history['val_loss'], columns=['Test_loss']);
df_loss = concat([df_train_loss,df_test_loss], axis=1)
Min_loss = max(df_loss['Test_loss'])
for i in range(ini_epochs):
Test_loss = df_loss['Test_loss'][i];
Train_loss = df_loss['Train_loss'][i];
if Test_loss > Train_loss and Test_loss < Min_loss:
Min_loss = Test_loss;
Run Code Online (Sandbox Code Playgroud)
逻辑背后的想法是这样的;为了得到最好的模型,选择的epoch应该选择损失值最低的模型,但它必须高于训练损失值以避免过拟合。
总体来说,这种epoch选择方法是可以工作的。但是,如果测试损失值从一开始就低于训练损失,则此方法会选择零纪元(见下文)。

现在我可以添加另一个if语句来评估测试和训练损失之间的差异是正还是负,然后为每种情况编写逻辑,但是如果差异开始为正,然后最终为负,会发生什么。我很困惑,无法编写有效的代码。
所以,我的问题是:
1)您能否向我展示您将编写哪些代码来解释图中显示的情况(以及测试和训练损失曲线交叉的情况)。我想说的策略是采用差异最小的值。
2)我很可能以错误的方式处理这件事。我知道 Keras 有回调功能,但我不喜欢使用该save_best_only功能的想法,因为它可以保存过度拟合的模型。任何关于更有效的纪元选择方法的建议都会很棒。