【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の問題らしいので、深さを増やしてあげると解決できるらしい。
- Maximum Depth Recursion limit exceeded #1865 - keras-team/keras
- sys.setrecursionlimit - 公式ドキュメント 29.1. sys — システムパラメータと関数
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)