前提
サイトの丸写しをしていたところ、エラーが発生しました。
https://www.sejuku.net/blog/53512
実現したいこと
エラーが発生しなくなり、サイトのコードが動作すること。
発生している問題・エラーメッセージ
x_train shape: (60000, 28, 28, 1) 60000 train samples 10000 test samples --------------------------------------------------------------------------- ValueError Traceback (most recent call last) /var/folders/1b/4r83ph916kb86bjsvm74d7740000gn/T/ipykernel_1047/3293630069.py in <module> 42 model.add(Dense(num_classes, activation='softmax')) 43 ---> 44 model.compile(loss=keras.losses.categorical_crossentropy, 45 optimizer=Adadelta(), 46 metrics=['accuracy']) /usr/local/lib/python3.9/site-packages/tensorflow/python/keras/engine/training.py in compile(self, optimizer, loss, metrics, loss_weights, weighted_metrics, run_eagerly, steps_per_execution, **kwargs) 571 self._run_eagerly = run_eagerly 572 --> 573 self.optimizer = self._get_optimizer(optimizer) 574 self.compiled_loss = compile_utils.LossesContainer( 575 loss, loss_weights, output_names=self.output_names) /usr/local/lib/python3.9/site-packages/tensorflow/python/keras/engine/training.py in _get_optimizer(self, optimizer) 609 return opt 610 --> 611 return nest.map_structure(_get_single_optimizer, optimizer) 612 613 @trackable.no_automatic_dependency_tracking /usr/local/lib/python3.9/site-packages/tensorflow/python/util/nest.py in map_structure(func, *structure, **kwargs) 867 868 return pack_sequence_as( --> 869 structure[0], [func(*x) for x in entries], 870 expand_composites=expand_composites) 871 /usr/local/lib/python3.9/site-packages/tensorflow/python/util/nest.py in <listcomp>(.0) 867 868 return pack_sequence_as( --> 869 structure[0], [func(*x) for x in entries], 870 expand_composites=expand_composites) 871 /usr/local/lib/python3.9/site-packages/tensorflow/python/keras/engine/training.py in _get_single_optimizer(opt) 600 601 def _get_single_optimizer(opt): --> 602 opt = optimizers.get(opt) 603 if (loss_scale is not None and 604 not isinstance(opt, lso.LossScaleOptimizer)): /usr/local/lib/python3.9/site-packages/tensorflow/python/keras/optimizers.py in get(identifier) 129 return deserialize(config) 130 else: --> 131 raise ValueError( 132 'Could not interpret optimizer identifier: {}'.format(identifier)) ValueError: Could not interpret optimizer identifier: <keras.optimizer_v2.adadelta.Adadelta object at 0x139ae80d0>
該当のソースコード
python
1'''Trains a simple convnet on the MNIST dataset. 2Gets to 99.25% test accuracy after 12 epochs 3(there is still a lot of margin for parameter tuning). 416 seconds per epoch on a GRID K520 GPU. 5''' 6 7from __future__ import print_function 8from tensorflow.keras.utils import to_categorical 9from tensorflow.keras.optimizers import Adadelta 10from tensorflow.python.keras.datasets import mnist 11from tensorflow.python.keras.models import Sequential 12from tensorflow.python.keras.layers import Dense, Dropout, Flatten 13from tensorflow.python.keras.layers import Conv2D, MaxPooling2D 14from tensorflow.python.keras import backend as K 15 16batch_size = 128 17num_classes = 10 18epochs = 12 19 20# input image dimensions 21img_rows, img_cols = 28, 28 22 23# the data, split between train and test sets 24(x_train, y_train), (x_test, y_test) = mnist.load_data() 25 26if K.image_data_format() == 'channels_first': 27 x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols) 28 x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols) 29 input_shape = (1, img_rows, img_cols) 30else: 31 x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1) 32 x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1) 33 input_shape = (img_rows, img_cols, 1) 34 35x_train = x_train.astype('float32') 36x_test = x_test.astype('float32') 37x_train /= 255 38x_test /= 255 39print('x_train shape:', x_train.shape) 40print(x_train.shape[0], 'train samples') 41print(x_test.shape[0], 'test samples') 42 43# convert class vectors to binary class matrices 44y_train = to_categorical(y_train, num_classes) 45y_test = to_categorical(y_test, num_classes) 46 47model = Sequential() 48model.add(Conv2D(32, kernel_size=(3, 3), 49 activation='relu', 50 input_shape=input_shape)) 51model.add(Conv2D(64, (3, 3), activation='relu')) 52model.add(MaxPooling2D(pool_size=(2, 2))) 53model.add(Dropout(0.25)) 54model.add(Flatten()) 55model.add(Dense(128, activation='relu')) 56model.add(Dropout(0.5)) 57model.add(Dense(num_classes, activation='softmax')) 58 59model.compile(loss=keras.losses.categorical_crossentropy, 60 optimizer=Adadelta(), 61 metrics=['accuracy']) 62 63model.fit(x_train, y_train, 64 batch_size=batch_size, 65 epochs=epochs, 66 verbose=1, 67 validation_data=(x_test, y_test)) 68score = model.evaluate(x_test, y_test, verbose=0) 69print('Test loss:', score[0]) 70print('Test accuracy:', score[1])
試したこと
以下のサイトを参考にエラーを直していきました。
https://keras.io/ja/optimizers/#adadelta
https://bobbyhadz-com.translate.goog/blog/python-attributeerror-module-keras-utils-has-no-attribute-to-categorical?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=sc
補足情報(FW/ツールのバージョンなど)
jupyter notebookで作業しています。
import tensorflow as tf print(tf.__version__) # 1.5.0
を実行したところ2.6.0と出ました。
from tensorflow.python.keras.datasets import mnist
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense, Dropout, Flatten
from tensorflow.python.keras.layers import Conv2D, MaxPooling2D
from tensorflow.python.keras import backend as K
↓ 変更
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras import backend as K
model.compile(loss=keras.losses.categorical_crossentropy,
↓ 変更
model.compile(loss=tf.keras.losses.categorical_crossentropy,
で、どうでしょうか?
変更点
from __future__ import print_function
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.optimizers import Adadelta
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras import backend as K
from tensorflow.keras.losses import categorical_crossentropy
model.compile(loss=categorical_crossentropy(),
optimizer=Adadelta(),
metrics=['accuracy'])
上記のように変更したところ以下のエラーが発生しました。
x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/var/folders/1b/4r83ph916kb86bjsvm74d7740000gn/T/ipykernel_1109/3977368573.py in <module>
42 model.add(Dense(num_classes, activation='softmax'))
43
---> 44 model.compile(loss=categorical_crossentropy(),
45 optimizer=Adadelta(),
46 metrics=['accuracy'])
/usr/local/lib/python3.9/site-packages/tensorflow/python/util/dispatch.py in wrapper(*args, **kwargs)
204 """Call target, and fall back on dispatchers if there is a TypeError."""
205 try:
--> 206 return target(*args, **kwargs)
207 except (TypeError, ValueError):
208 # Note: convert_to_eager_tensor currently raises a ValueError, not a
TypeError: categorical_crossentropy() missing 2 required positional arguments: 'y_true' and 'y_pred'
loss=categorical_crossentropyに変更したところ実行できました。
loss=categorical_crossentropyの意味を教えてもらえませんか?
https://teratail.com/questions/228397
は読んだのですが、関数そのものを渡してどうなっているのかがわかりません。
kerasのドキュメントを読んだら解決しました。損失関数を設定しているのですね。

回答1件
あなたの回答
tips
プレビュー