前提・実現したいこと
勾配にアクセスする必要があるので、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
ほか必要情報があれば追記しますので、メッセージください
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。