!pip install foolbox==2.4.0 import numpy as np from tensorflow.keras.applications.resnet50 import ResNet50 from foolbox.criteria import Misclassification, ConfidentMisclassification from tensorflow.keras.preprocessing import image as img from tensorflow.keras.applications.resnet50 import preprocess_input, decode_predictions import matplotlib.pyplot as plt import foolbox import pprint as pp import tensorflow.keras %matplotlib inline --------------------------------------------------- def load_image(img_path: str): image = img.load_img(img_path, target_size=(224, 224)) plt.imshow(image) x = img.img_to_array(image) return x image = load_image('DSC_0897.jpg') -------------------------------------------------------- tensorflow.keras.backend.set_learning_phase(0) kmodel = ResNet50(weights='imagenet') preprocessing = (np.array([104, 116, 123]), 1) fmodel = foolbox.models.KerasModel(kmodel, bounds=(0, 255), preprocessing=preprocessing) to_classify = np.expand_dims(image, axis=0) preds = kmodel.predict(to_classify) print('Predicted:', pp.pprint(decode_predictions(preds, top=20)[0])) label = np.argmax(preds) image = image[:, :, ::-1] attack = foolbox.attacks.FGSM(fmodel, threshold=.9, criterion=ConfidentMisclassification(.9)) adversarial = attack(image, label) new_preds = kmodel.predict(np.expand_dims(adversarial, axis=0)) print('Predicted:', pp.pprint(decode_predictions(new_preds, top=20)[0]))
を実行しようと思っているのですが、
TypeError Traceback (most recent call last) <ipython-input-16-df2f00679ec1> in <module>() 4 5 fmodel = foolbox.models.KerasModel(kmodel, bounds=(0, 255), ----> 6 preprocessing=preprocessing) 7 8 to_classify = np.expand_dims(image, axis=0) 1 frames /usr/local/lib/python3.7/dist-packages/keras/engine/keras_tensor.py in op(self) 231 @property 232 def op(self): --> 233 raise TypeError('Keras symbolic inputs/outputs do not ' 234 'implement `op`. You may be ' 235 'trying to pass Keras symbolic inputs/outputs ' TypeError: Keras symbolic inputs/outputs do not implement `op`. You may be trying to pass Keras symbolic inputs/outputs to a TF API that does not register dispatching, preventing Keras from automatically converting the API call to a lambda layer in the Functional Model.
というエラーが表示されてしまいます。
どのように改善すればよいでしょうか?
教えていただきたいです。
根拠はありませんが、TFのデータをNumpyで捌こうとしてエラーが出ているような気がします。
というのも、
from tensorflow.keras.preprocessing import image as img
とあって x = img.img_to_array(image)ですので、xはTF関連の中身と思います。
そこにnp.expand_dims(image, axis=0) ※ここでimageの中身は上記xと思います。
としていますのでnp.○○(TFのもの,axis=0)という構図になっているのがエラーの原因のような気がします。nparrayじゃなくてTFのTensorなりなんなりをNumpyに捌かせようとしているというのでしょうか。
試しにtf.expand_dimsに切り替えても動かした結果を教えてもらえますか?