首页 > 解决方案 > 如何调试 RNN?

问题描述

我已经为光学应用建立了一个 ResNet50 网络。对于两个输入图像,网络给出了 65 个值的估计值(回归)并且效果很好。然而,这两个输入图像属于一个时间序列,并且时间序列的图像在 10-15 次的跨度上会有一定的相关性,所以我希望额外的 RNN 可以改进估计。我尝试设置图中所示的网络,使用通过单独训练和“TimeDistributed”ResNet50s 找到的大部分冻结的 ResNet50 参数值。然而,RNN 训练并没有给出有用的准确性。

完整的 LSTM 网络

我现在花了 2-3 周的时间尝试调试我的代码(特别是生成器),但我没有发现任何编码错误。无奈之下,我尝试建立我能想到的最简单的 RNN:一个完整​​的 Resnet50,其中包含一个或两个具有线性激活的 SimpleRNN。然而,尽管有相关的时间序列,但它们甚至不能提供与单独的 ResNet50 几乎相同的准确度。

SimpleRNN 网络

所以我的问题是:假设具有线性激活的单个 SimpleRNN 应该提供与单独的 ResNet50 相同的精度是否正确?

标签: kerasregressionlstmrecurrent-neural-networkresnet

解决方案


这有点推测,但它可能会建议一种调试 RNN 并回答您的问题的方法。这是一个非常简单的网络,带有一个 SimpleRNN 和 2 个样本的测试输入,每个样本都有一个时间步长和一个特征:即 shape=(2,1,1)

from keras.models import Sequential
from keras.layers import SimpleRNN
import numpy as np

x_train=np.array([[[0.1]],
                  [[0.2]]])

y_train=np.array([[1],[0]])
print(x_train.shape)
print(x_train)

print(y_train.shape)
print(y_train)

#simple network
model = Sequential()
model.add(SimpleRNN(1,activation=None, use_bias=False, input_shape=(1,1)))
model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])

model.fit(x_train, y_train, epochs=10, batch_size=2)

wgt=model.get_weights()
print(wgt)
print('model.predict(x_train)')
print(model.predict(x_train))

基于上述运行,RNN 网络产生了两个权重。第一个似乎是输入的简单缩放,第二个我怀疑是循环循环的权重,如本例所示,它实际上并未用于单个时间步长。激活是线性的,因此结果与 model.predict 匹配。

您可以扩展此方法以推理 Resnet 的性能并可能回答您的问题。我希望这有帮助。


推荐阅读