前提・実現したいこと
Grad-CAMで自作モデルを使おうと思い。以下コードを実行しました。
K.gradientsの部分でエラーが出てつまずいています。
■■な機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
File "/home/コンピュータ名/.local/lib/python3.6/site-packages/tensorflow/python/ops/gradients_util.py", line 491, in _GradientsHelper raise RuntimeError("tf.gradients is not supported when eager execution " RuntimeError: tf.gradients is not supported when eager execution is enabled. Use tf.GradientTape instead.
該当のソースコード
python
1import tensorflow as tf 2import pandas as pd 3import numpy as np 4import cv2 5from keras import backend as K 6from keras.preprocessing.image import array_to_img, img_to_array, load_img 7from keras.models import load_model 8 9K.set_learning_phase(1) #set learning phase 10# tf.compat.v1.disable_eager_execution() 11 12 13def Grad_Cam(input_model, x, layer_name): 14 ''' 15 Args: 16 input_model: モデルオブジェクト 17 x: 画像(array) 18 layer_name: 畳み込み層の名前 19 20 Returns: 21 jetcam: 影響の大きい箇所を色付けした画像(array) 22 23 ''' 24 25 # 前処理 26 X = np.expand_dims(x, axis=0) 27 28 X = X.astype('float32') 29 preprocessed_input = X / 255.0 30 31 32 # 予測クラスの算出 33 34 predictions = model.predict(preprocessed_input) 35 class_idx = np.argmax(predictions[0]) 36 class_output = model.output[:, class_idx] 37 38 39 # 勾配を取得 40 41 conv_output = model.get_layer(layer_name).output # layer_nameのレイヤーのアウトプット 42 grads = K.gradients(class_output, conv_output)[0] # gradients(loss, variables) で、variablesのlossに関しての勾配を返す 43 # g = tf.Graph() 44 # with g.as_default(): 45 # grads = tf.GradientTape(class_output, conv_output)[0] 46 47 # grads 48 49 gradient_function = K.function([model.input], [conv_output, grads]) # model.inputを入力すると、conv_outputとgradsを出力する関数 50 conv_output = model.get_layer(layer_name).output # layer_nameのレイヤーのアウトプット 51 grads = K.gradients(class_output, conv_output)[0] # gradients(loss, variables) で、variablesのlossに関しての勾配を返す 52 gradient_function = K.function([model.input], [conv_output, grads]) # model.inputを入力すると、conv_outputとgradsを出力する関数 53 54 output, grads_val = gradient_function([preprocessed_input]) 55 output, grads_val = output[0], grads_val[0] 56 57 # 重みを平均化して、レイヤーのアウトプットに乗じる 58 weights = np.mean(grads_val, axis=(0, 1)) 59 cam = np.dot(output, weights) 60 61 62 # 画像化してヒートマップにして合成 63 cv2.imwrite("gradcam.jpg", cam) 64 cam = cv2.resize(cam, (224, 224), cv2.INTER_LINEAR) # 画像サイズは200で処理したので 65 cam = np.maximum(cam, 0) 66 cam = cam / cam.max() 67 68 jetcam = cv2.applyColorMap(np.uint8(255 * cam), cv2.COLORMAP_JET) # モノクロ画像に疑似的に色をつける 69 jetcam = cv2.cvtColor(jetcam, cv2.COLOR_BGR2RGB) # 色をRGBに変換 70 jetcam = (np.float32(jetcam) + x / 2) # もとの画像に合成 71 72 return jetcam 73 74model = load_model("モデルのパス") 75model.summary() 76x = img_to_array(load_img('画像のパス', target_size=(224,224))) 77array_to_img(x) 78 79image = Grad_Cam(model, x, 'block5_conv3') 80array_to_img(image)
試したこと
2サイトを参考にしてエラーの解決を試みました。
リンク内容
上記サイトの
g = tf.Graph()
with g.as_default():
grads = tf.gradients(class_output, layer_output)[0]
grads
の部分に書き換えてみたところ、以下エラーがでます。
File "/home/コンピュータ名/デスクトップ/sakagawa/grad_cam_original.py", line 52, in Grad_Cam
grads = tf.GradientTape(class_output, conv_output)[0]
TypeError: 'GradientTape' object does not support indexing
リンク内容
上記サイトの
tf.compat.v1.disable_eager_execution()
を追加したところエラーは消えたのですが、実行結果の画像が表示されません。
補足情報(FW/ツールのバージョンなど)
ubuntu:16.04.6 LTS
python:3.6.10
tensorflow:2.3.0
keras:2.4.3
あなたの回答
tips
プレビュー