Миграция кода в tenorflow 2.0 приводит к ошибке «Недопустимый аргумент»: по умолчанию MaxPoolingOp поддерживает только NHW C на ЦП типа устройства - PullRequest
0 голосов
/ 18 февраля 2020

Я перенесу некоторый код из Keras API + Tensorflow 1.14 в Tensorflow 2.0 и tf.keras. Где код ранее работал нормально; теперь выдает следующую ошибку.

2020-02-18 21:38:17.678879: E tensorflow/core/common_runtime/executor.cc:642] Executor failed to create kernel. Invalid argument: Default MaxPoolingOp only supports NHWC on device type CPU
     [[{{node sequential/max_pooling2d/MaxPool}}]]
Traceback (most recent call last):
  File "C:/Users/ymeli/MEGA/Machine Learning/9. Deep learning for Python/5. Convolutional neural networks/CH19_Digits.py", line 70, in <module>
    model.fit(X_train, y_train, validation_data=(X_test, y_test), batch_size=200, epochs=10, verbose=2)
  File "C:\Users\ymeli\Anaconda3\envs\Anaconda3.7\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 728, in fit
    use_multiprocessing=use_multiprocessing)
  File "C:\Users\ymeli\Anaconda3\envs\Anaconda3.7\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 324, in fit
    total_epochs=epochs)
  File "C:\Users\ymeli\Anaconda3\envs\Anaconda3.7\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 123, in run_one_epoch
    batch_outs = execution_function(iterator)
  File "C:\Users\ymeli\Anaconda3\envs\Anaconda3.7\lib\site-packages\tensorflow_core\python\keras\engine\training_v2_utils.py", line 86, in execution_function
    distributed_function(input_fn))
  File "C:\Users\ymeli\Anaconda3\envs\Anaconda3.7\lib\site-packages\tensorflow_core\python\eager\def_function.py", line 457, in __call__
    result = self._call(*args, **kwds)
  File "C:\Users\ymeli\Anaconda3\envs\Anaconda3.7\lib\site-packages\tensorflow_core\python\eager\def_function.py", line 520, in _call
    return self._stateless_fn(*args, **kwds)
  File "C:\Users\ymeli\Anaconda3\envs\Anaconda3.7\lib\site-packages\tensorflow_core\python\eager\function.py", line 1823, in __call__
    return graph_function._filtered_call(args, kwargs)  # pylint: disable=protected-access
  File "C:\Users\ymeli\Anaconda3\envs\Anaconda3.7\lib\site-packages\tensorflow_core\python\eager\function.py", line 1141, in _filtered_call
    self.captured_inputs)
  File "C:\Users\ymeli\Anaconda3\envs\Anaconda3.7\lib\site-packages\tensorflow_core\python\eager\function.py", line 1224, in _call_flat
    ctx, args, cancellation_manager=cancellation_manager)
  File "C:\Users\ymeli\Anaconda3\envs\Anaconda3.7\lib\site-packages\tensorflow_core\python\eager\function.py", line 511, in call
    ctx=ctx)
  File "C:\Users\ymeli\Anaconda3\envs\Anaconda3.7\lib\site-packages\tensorflow_core\python\eager\execute.py", line 67, in quick_execute
    six.raise_from(core._status_to_exception(e.code, message), None)
  File "<string>", line 3, in raise_from
tensorflow.python.framework.errors_impl.InvalidArgumentError:  Default MaxPoolingOp only supports NHWC on device type CPU
     [[node sequential/max_pooling2d/MaxPool (defined at \Users\ymeli\Anaconda3\envs\Anaconda3.7\lib\site-packages\tensorflow_core\python\framework\ops.py:1751) ]] [Op:__inference_distributed_function_1139]

Function call stack:
distributed_function


Process finished with exit code 1

Сценарий, который я запускаю, относительно прост. Это классифицирующие цифры CNN. Мой процессор - AMD ryzen 9 3900X.

from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Dropout
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Convolution2D
from tensorflow.keras.layers import MaxPooling2D
from tensorflow.keras.utils import to_categorical
from tensorflow.keras import backend as K

K.set_image_data_format("channels_first")

# Load Data
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# Reshape to be [# of samples][channels][width][height]
X_train = X_train.reshape(X_train.shape[0], 1, 28, 28).astype('float32') 
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28).astype('float32')


# normalize inputs from 0-255 to 0-1
X_train = X_train / 255
X_test = X_test / 255

# One hot encode outputs
y_train = to_categorical(y_train)   
y_test = to_categorical(y_test)
num_classes = y_test.shape[1]


# define baseline model
def baseline_model():
    model = Sequential()
    model.add(Convolution2D(30, kernel_size=(5, 5), kernel_initializer='normal', padding='valid', input_shape=(1, 28, 28), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(
        Convolution2D(15, kernel_size=(3, 3), kernel_initializer='normal', padding='valid', input_shape=(1, 28, 28)))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.2))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dense(50, activation='relu'))
    model.add(Dense(num_classes, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model


model = baseline_model()
model.fit(X_train, y_train, validation_data=(X_test, y_test), batch_size=200, epochs=10, verbose=2)
scores = model.evaluate(X_test, y_test, verbose=2)
print("Large CNN Error: {}%".format(100 - scores[1] * 100))

1 Ответ

0 голосов
/ 19 февраля 2020

Мне удалось решить проблему самостоятельно. Проблема заключалась в том, что эта новая версия tenorflow поддерживает только формат NHCW на процессоре (NHCW означает число примеров, высота, ширина, каналы). Таким образом, изменив

K.set_image_data_format("channels_first") 

на

K.set_image_data_format("channels_last")

и

X_train = X_train.reshape(X_train.shape[0],1, 28, 28).astype('float32')  
X_test = X_test.reshape(X_test.shape[0],1, 28, 28).astype('float32')

на

X_train = X_train.reshape(X_train.shape[0] 28, 28, 1).astype('float32')  
X_test = X_test.reshape(X_test.shape[0],1, 28, 28, 1).astype('float32')

и, наконец,

model.add(Convolution2D(30, kernel_size=(5, 5), kernel_initializer='normal', padding='valid', input_shape=(1, 28, 28),activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Convolution2D(15, kernel_size=(3, 3), kernel_initializer='normal', padding='valid', input_shape=(1, 28, 28)))

до

model.add(Convolution2D(30, kernel_size=(5, 5), kernel_initializer='normal', padding='valid', input_shape=(28, 28, 1),activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Convolution2D(15, kernel_size=(3, 3), kernel_initializer='normal', padding='valid', input_shape=(28, 28, 1)))

Размеры снова верны, и проблема решена. Все снова отлично работает =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...