【keras】weightの中身をみるために「RuntimeError: maximum recursion depth exceeded」と「RecursionError: cannot set the recursion limit the limit is too low」を解決

やりたいこと

画像補完のプログラムを作成しているが、学習によって作成されたweightの中にnanが混ざり込んでいてうまく画像が生成されず真っ黒の画像が出てきてしまう。 そこでweight(h5ファイル)の中身を見てどこがnanになっているか確認したい。

方針1:get_weightsを使う

以下のサイトを参考にした。
kerasのmodel.get_weights()で得られるlistの構造 - Qiita

model = PConvUnet(weight_filepath='data/logs/')
model.get_weights()

ここで以下のエラーが発生

RuntimeError: maximum recursion depth exceeded

再帰処理が最大の深さまでいっちゃてるというエラー。 これはPythonの問題らしいので、深さを増やしてあげると解決できるらしい。

import sys
sys.setrecursionlimit(10000)

すると次は以下のようなエラーが発生

RecursionError: cannot set the recursion limit the limit is too low 〜〜

方針を変える。

方針2:model.layersをforループで回す

for layer in model.layers:
    print(layer)

すると以下のようなエラーが発生。
エラー内容は以下を参考に。

TypeError: 'method' object is not iterable

ここれいうmodelは、自作のPConvUnetというものをラッパーとして使っているので、結局以下のようにしてnanを発見した。

for layer in model.model.layers:
    weights = layer.get_weights()
    for weight in weights:
        print(weight.shape)
        if np.any(np.isnan(weight)):
            print(layer.name)
            print(weights)

参考まとめ