質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1134閲覧

CNNで生成したモデルをGradCAMアルゴリズムで可視化したい

tamagokakegohan

総合スコア8

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

2グッド

2クリップ

投稿2017/10/20 15:55

編集2017/10/21 01:29

初めまして,深層学習を学んでいる者です。
現在,CNNで画像を学習し,5つの物体の画像認識をしています。
CNNで生成したモデルの可視化を行うために,Grad-CAMアルゴリズムを調べました。
参考URL1では,University of Oxford の VGG チームが生成したVGGモデルから特徴量の可視化を行っていました。
このソースコードを自分の作ったモデル(gradcam.npz)で可視化を行いたいのですが
以下のエラーメッセージが発生しました。どなたか分かる人がいたらご教授お願い致します。
また,自分の質問に何か不備なところがありましたらご指摘の方よろしくお願いいたします。

###主な環境
Anaconda3
tensorflow (1.2.1)
tensorlayer (1.6.5)
python (3.5)

###発生している問題・エラーメッセージ

フォルダ>python mainmodel.py --input laska.png --output laska_save.png --layer_name pool2 During handling of the above exception, another exception occurred: Traceback (most recent call last): File "mainmodel.py", line 103, in <module> tf.app.run() File "C:\Ana3\envs\tensorflow\lib\site-packages\tensorflow\python\platform\app.py", line 48, in run _sys.exit(main(_sys.argv[:1] + flags_passthrough)) File "mainmodel.py", line 72, in main vgg = vgg16(imgs, 'gradcam.npz', sess) File "C:\Ana3\tutorialGradCAM\vgg.py", line 23, in __init__ self.load_weights(weights, sess) File "C:\Ana3\tutorialGradCAM\vgg.py", line 274, in load_weights sess.run(self.parameters[i].assign(weights[k])) File "C:\Ana3\envs\tensorflow\lib\site-packages\tensorflow\python\ops\variables.py", line 516, in assign return state_ops.assign(self._variable, value, use_locking=use_locking) File "C:\Ana3\envs\tensorflow\lib\site-packages\tensorflow\python\ops\state_ops.py", line 271, in assign validate_shape=validate_shape) File "C:\Ana3\envs\tensorflow\lib\site-packages\tensorflow\python\ops\gen_state_ops.py", line 45, in assign use_locking=use_locking, name=name) File "C:\Ana3\envs\tensorflow\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 767, in apply_op op_def=op_def) File "C:\Ana3\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 2508, in create_op set_shapes_for_outputs(ret) File "C:\Ana3\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 1873, in set_shapes_for_outputs shapes = shape_func(op) File "C:\Ana3\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 1823, in call_with_requiring return call_cpp_shape_fn(op, require_shape_fn=True) File "C:\Ana3\envs\tensorflow\lib\site-packages\tensorflow\python\framework\common_shapes.py", line 610, in call_cpp_shape_fn debug_python_shape_fn, require_shape_fn) File "C:\Ana3\envs\tensorflow\lib\site-packages\tensorflow\python\framework\common_shapes.py", line 676, in _call_cpp_shape_fn_impl raise ValueError(err.message) ValueError: Shapes must be equal rank, but are 4 and 1 for 'Assign' (op: 'Assign') with input shapes: [3,3,3,64], [0].

###GradCAMで可視化するためのソースコード

from vgg import vgg16 import tensorflow as tf import numpy as np from skimage import io from skimage.transform import resize from matplotlib import pyplot as plt from imagenet_classes import class_names from scipy.misc import imread, imresize flags = tf.app.flags flags.DEFINE_string("input", "ab.jpg", "Path to input image ['ab.jpg']") flags.DEFINE_string("output", "abs.jpg", "Path to input image ['abs.jpg']") flags.DEFINE_string("layer_name", "pool5", "Layer till which to backpropagate ['pool5']") FLAGS = flags.FLAGS def load_image(img_path): print("Loading image") img = imread(img_path, mode='RGB') img = imresize(img, (56, 56)) # Converting shape from [224,224,3] tp [1,224,224,3] x = np.expand_dims(img, axis=0) # Converting RGB to BGR for VGG x = x[:,:,:,::-1] return x, img def grad_cam(x, vgg, sess, predicted_class, layer_name, nb_classes): print("Setting gradients to 1 for target class and rest to 0") # Conv layer tensor [?,7,7,512] conv_layer = vgg.layers[layer_name] # [1000]-D tensor with target class index set to 1 and rest as 0 one_hot = tf.sparse_to_dense(predicted_class, [nb_classes], 1.0) signal = tf.multiply(vgg.layers['fc3'], one_hot) loss = tf.reduce_mean(signal) grads = tf.gradients(loss, conv_layer)[0] # Normalizing the gradients norm_grads = tf.div(grads, tf.sqrt(tf.reduce_mean(tf.square(grads))) + tf.constant(1e-5)) output, grads_val = sess.run([conv_layer, norm_grads], feed_dict={vgg.imgs: x}) output = output[0] # [7,7,512] grads_val = grads_val[0] # [7,7,512] weights = np.mean(grads_val, axis = (0, 1)) # [512] cam = np.ones(output.shape[0 : 2], dtype = np.float32) # [7,7] # Taking a weighted average for i, w in enumerate(weights): cam += w * output[:, :, i] # Passing through ReLU cam = np.maximum(cam, 0) cam = cam / np.max(cam) cam = resize(cam, (56,56)) # Converting grayscale to 3-D cam3 = np.expand_dims(cam, axis=2) cam3 = np.tile(cam3,[1,1,3]) return cam3 def main(_): x, img = load_image(FLAGS.input) sess = tf.Session() print("\nLoading Vgg") imgs = tf.placeholder(tf.float32, [None, 56, 56, 3]) vgg = vgg16(imgs, 'gradcam.npz', sess) #'gradcam.npz'は生成したモデル print("\nFeedforwarding") prob = sess.run(vgg.probs, feed_dict={vgg.imgs: x})[0] preds = (np.argsort(prob)[::-1])[0:4] print('\nTop 5 classes are') for p in preds: print(class_names[p], prob[p]) # Target class predicted_class = preds[0] # Target layer for visualization layer_name = FLAGS.layer_name # Number of output classes of model being used nb_classes = 5 cam3 = grad_cam(x, vgg, sess, predicted_class, layer_name, nb_classes) img = img.astype(float) img /= img.max() # Superimposing the visualization with the image. new_img = img+3*cam3 new_img /= new_img.max() # Display and save io.imshow(new_img) plt.show() io.imsave(FLAGS.output, new_img) if __name__ == '__main__': tf.app.run()

###試したこと
tensorflowのモデルファイルckptファイルをnpzファイルに変換.これは,参考URL1の生成モデルがnpzファイルだったため変換を行いました.
変換するために,tensorlayer(1.6.5)をインストールしましたた.
推測ではありますが,参考URL1ではVGGモデルでモデルの可視化を行っていました.
VGGを扱うための関数か何かを自分の生成したモデルの関数に変更すれば可視化できると考えています.

###補足情報(参考文献等)
参考URL1:GradCAMによる可視化の参考文献
main.pyでは,VGGモデルを用いて,GradCAMで可視化しました.
下に記したコマンドによりmain.pyを実行し,可視化していました.
python main.py --input laska.png --output laska_save.png --layer_name pool5
参考URL2: 生成したモデルの参考文献

mhashi👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/10/21 01:17

このエラーが出る直前に何行目のどの関数でValueErrorが起きたか出てきましたか?もし出てきた場合には、一緒に載せてもらえませんか?
tamagokakegohan

2017/10/21 01:32

@slash さん ご指摘ありがとうございます. エラーが起きた場所を一緒に乗せました
退会済みユーザー

退会済みユーザー

2017/10/21 02:19

vgg = vgg16(imgs, 'gradcam.npz', sess)の引数になにかありそうですね
退会済みユーザー

退会済みユーザー

2017/10/21 02:23

teratailの方針でマルチポストは禁止はされていませんが、いくらかルールがあるようなのでそちらもご覧ください。(https://teratail.com/help)
tamagokakegohan

2017/10/21 13:12

@slashさん すいません,マルチポストにならないように訂正しました. 以後気を付けます.
退会済みユーザー

退会済みユーザー

2017/10/22 01:13

たぶん、teratailは「マルチポストはやっても良いいけれども、片方(例えばStackoverflow)で分かったことがもう片方(例えばTeratail)ではまだ分かっていないというような、情報共有がうまくいかないのが(ムダな手間につながるから)いけないよ」ということだと思います o.0
guest

回答1

0

ベストアンサー

同じデータを共有することはたぶんできないですよね…

誰もやったことのないことをやられているようですし、同じモデルを他の人が持っているわけではないので、やってみて走らせて、エラーを見ながら、最後に解決できるのはcalmさんしかいないと思います。

なので、怪しいところだけを書きます。


この問題の一番のミソは、
以下のエラーメッセ―ジによれば、エラーの末端にある

  • 'Assign'に対してランク4の値が欲しいのに、ランク1のデータが渡された

ということのようです。

そして、エラーが起きているコードのうち、calmさんが書いたコードの末端部分はvgg = vgg16(imgs, 'gradcam.npz', sess)ですね。(vgg16はかなりの人が使っているので、たぶんここでコケる原因となるバグは無いと仮定すると、)怪しいのはimgsっぽい気がします。

rankの考え方はTensorFlowのRank, Shapeについて@uyuniさんが分かりやすいと思います。

実際の解決については、NickTGrahamさんのようにネストすれば解決できると思われます。


Python

1# エラーの転記です。コードではありません。 2 3フォルダ>python mainmodel.py --input laska.png --output laska_save.png --layer_name pool2 4 5During handling of the above exception, another exception occurred: 6 7Traceback (most recent call last): 8 File "mainmodel.py", line 103, in <module> 9 tf.app.run() 10 File "C:\Ana3\envs\tensorflow\lib\site-packages\tensorflow\python\platform\app.py", line 48, in run 11 _sys.exit(main(_sys.argv[:1] + flags_passthrough)) 12 File "mainmodel.py", line 72, in main 13 vgg = vgg16(imgs, 'gradcam.npz', sess) 14 15# (中略:ここまでがcalmさんが書いたコード、以下そのままのコードと仮定します) 16 17 File "C:\Ana3\envs\tensorflow\lib\site-packages\tensorflow\python\framework\common_shapes.py", line 676, in _call_cpp_shape_fn_impl 18 raise ValueError(err.message) 19ValueError: Shapes must be equal rank, but are 4 and 1 for 'Assign' (op: 'Assign') with input shapes: [3,3,3,64], [0].

投稿2017/10/22 01:49

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tamagokakegohan

2017/10/22 13:32

@slashさん 回答ありがとうございました。問題解決に取り組みたいと思います。 そして,マナー等も教えていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問