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

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

新規登録して質問してみよう
ただいま回答率
85.48%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2680閲覧

tf.GradientTape()の返り値がNoneになってしまう

hoshikawa

総合スコア6

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/05 06:44

編集2020/05/05 06:53

前提・実現したいこと

勾配にアクセスする必要があるので、tf.GradientTape()を使用しています。
tutorialを参考にコードを書いているのですが、値にNoneが帰ってきます。
調べたところmodel.predictを用いては行けない可能性があるというものを見つけたのですが、代替案が思いつきません。
ご助言いただけると幸いです

街灯のソースコード

参考にしているソースコード

def create_adversarial_pattern(input_image, input_label): print(type(input_image)) # 損失を計算 with tf.GradientTape() as tape: tape.watch(input_image) prediction = pretrained_model(input_image) loss = loss_object(input_label, prediction) # 損失の勾配を求め、AEのフィルターを作成 gradient = tape.gradient(loss, input_image) signed_grad = tf.sign(gradient) return signed_grad

私が作成したソースコード

def create_adversarial_pattern(input_image, input_label): ''' input_image : AEをほどこす画像を入力、わからないけど255で割った値で大丈夫だと思うからそんな感じ input_label : ワンホットベクトルのラベル ''' # 損失を計算 with tf.GradientTape() as tape: tape.watch(input_image) predict_classes = model.predict(learning_data_test) # print(type(predict_classes[0][0])) predict_class = tf.cast(predict_classes[1], tf.float32) predict_class = tf.reshape(predict_class, [1, 10]) prediction = predict_class loss = loss_object(input_label, prediction) # 損失の勾配を求め、AEのフィルターを作成 # ここでなぜかgradientがNoneになってしまう gradient = tape.gradient(loss, input_image) signed_grad = tf.sign(gradient) return signed_grad

エラー文

--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-92-de7e8c320f1e> in <module>() ----> 1 perturbations = create_adversarial_pattern(image, label) 7 frames <ipython-input-90-cf00bcaaa5e1> in create_adversarial_pattern(input_image, input_label) 34 # print(input_image) 35 print(gradient) ---> 36 signed_grad = tf.sign(gradient) 37 return signed_grad /usr/local/lib/python3.6/dist-packages/tensorflow/python/util/dispatch.py in wrapper(*args, **kwargs) 178 """Call target, and fall back on dispatchers if there is a TypeError.""" 179 try: --> 180 return target(*args, **kwargs) 181 except (TypeError, ValueError): 182 # Note: convert_to_eager_tensor currently raises a ValueError, not a /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_ops.py in sign(x, name) 578 tf.math.sign(x.values, ...), x.dense_shape). 579 """ --> 580 x = ops.convert_to_tensor(x) 581 if x.dtype in (dtypes.complex64, dtypes.complex128): 582 return gen_math_ops.div_no_nan( /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py in convert_to_tensor(value, dtype, name, as_ref, preferred_dtype, dtype_hint, ctx, accepted_result_types) 1339 1340 if ret is None: -> 1341 ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref) 1342 1343 if ret is NotImplemented: /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/constant_op.py in _constant_tensor_conversion_function(v, dtype, name, as_ref) 319 as_ref=False): 320 _ = as_ref --> 321 return constant(v, dtype=dtype, name=name) 322 323 /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/constant_op.py in constant(value, dtype, shape, name) 260 """ 261 return _constant_impl(value, dtype, shape, name, verify_shape=False, --> 262 allow_broadcast=True) 263 264 /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/constant_op.py in _constant_impl(value, dtype, shape, name, verify_shape, allow_broadcast) 268 ctx = context.context() 269 if ctx.executing_eagerly(): --> 270 t = convert_to_eager_tensor(value, ctx, dtype) 271 if shape is None: 272 return t /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/constant_op.py in convert_to_eager_tensor(value, ctx, dtype) 94 dtype = dtypes.as_dtype(dtype).as_datatype_enum 95 ctx.ensure_initialized() ---> 96 return ops.EagerTensor(value, ctx.device_name, dtype) 97 98 ValueError: Attempt to convert a value (None) with an unsupported type (<class 'NoneType'>) to a Tensor.

補足情報(FW/ツールのバージョンなど)

参考:
https://www.tensorflow.org/tutorials/generative/adversarial_fgsm
https://stackoverflow.com/questions/56916313/tensorflow-2-0-doesnt-compute-the-gradient/56917148#56917148

ほか必要情報があれば追記しますので、メッセージください

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

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

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

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

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

guest

回答1

0

自己解決

tensorflowのバージョンの問題でした。
バージョン2.0になったことで大きなアップデートが来たようです。

解決方法としては、import部分を変更する必要がありました。

before

import tensorflow as tf from keras.datasets import mnist import matplotlib.pyplot as plt from keras import backend as K import keras from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D

after

import tensorflow as tf from tensorflow.keras.datasets import mnist import matplotlib.pyplot as plt from tensorflow.keras import backend as K import keras from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D

投稿2020/05/06 08:24

hoshikawa

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問