提供された MobileNet V3 定義 (小さい) を使用して多数のグラフをトレーニングしましたが、視覚化を生成するために (tensorflow) Lucid を実行すると、Lucid はエラーで失敗します。Squeeze/Excite ブロックを除外するように定義を変更すると、ビジュアライゼーションが生成されます。
Tensorflow 1.14 と Lucid がインストールされている状態で、トレーニング済みの MobileNet V3 グラフ ファイル「Small dm=0.75 (float)」をここからダウンロードしました ( https://github.com/tensorflow/models/tree/master/research/slim/nets/mobilenet )、ファイルを「D:/temp」に抽出し、次のコードを実行しました。
import tensorflow as tf
import lucid.optvis.render as render
from lucid.modelzoo.vision_base import Model
class SSDMobilenetV3( Model ):
def __init__( self, graph_path ):
self.model_path = graph_path
self.input_name = "input"
self.image_shape = [ 224, 224, 3 ]
self.image_value_range = ( -1, 1 )
super().__init__()
model = SSDMobilenetV3( "D:/temp/v3-small_224_0.75_float/v3-small_224_0.75_float.pb" )
model.load_graphdef()
#model.show_graph()
_ = render.render_vis( model, "MobilenetV3/expanded_conv_6/output:0" )
かなりの量のスタック トレースがありますが、主なエラーは次のとおりです。
LookupError: gradient registry has no entry for: AddV2
と
LookupError: No gradient defined for operation 'import/MobilenetV3/expanded_conv_6/squeeze_excite/Conv_1/add' (op type: AddV2)
次に、「mobilenet_v3.py」の V3_SMALL_MINIMALISTIC 定義を使用して (新しい機能エクストラクタを登録)、テスト モデルをトレーニングしてみました。これは本質的に同じモデルですが、「squeeze_excite」の挿入はありません (ただし、hard_swish アクティベーション関数も元に戻しました)。
上記のコードは新しいモデルで問題なく実行され、画像がレンダリングされました。
これにより、問題は「squeeze_excite」の実装 (slim/nets/mobilenet/conv_blocks.py 内) にあると思われます。
しかし、私は問題をさらに診断することはできませんでした: それは Lucid なのか、Squeeze/Excite ブロックなのか、TensorFlow なのか、それとも単なる世界の事実なのか?