Python 将代码迁移到tensorflow 2.0时出现无效参数错误:默认MaxPoolGop仅支持设备类型CPU上的NHWC

Python 将代码迁移到tensorflow 2.0时出现无效参数错误:默认MaxPoolGop仅支持设备类型CPU上的NHWC,python,tensorflow,keras,Python,Tensorflow,Keras,我正在将一些代码从KerasAPI+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 NHW

我正在将一些代码从KerasAPI+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

我自己设法解决了这个问题。问题是这个新版本的tensorflow只支持CPU上的NHCW格式(NHCW代表示例数、高度、宽度、通道)。所以通过改变

K.set_image_data_format("channels_first") 

最后

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)))

现在尺寸又正确了,问题解决了。一切又恢复正常了=)

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)))