首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将代码迁移到TensorFlow2.0时出现无效参数错误:默认MaxPoolingOp仅支持设备类型CPU上的NHWC

将代码迁移到TensorFlow2.0时出现无效参数错误:默认MaxPoolingOp仅支持设备类型CPU上的NHWC
EN

Stack Overflow用户
提问于 2020-02-19 04:42:48
回答 1查看 220关注 0票数 0

我正在将一些代码从Keras API +TensorFlow1.14迁移到TensorFlow2.0和tf.keras。以前的代码运行得很好,现在抛出了以下错误。

代码语言:javascript
运行
复制
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分类数字。我的CPU是AMD ryzen 9 3900X。

代码语言:javascript
运行
复制
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))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-19 05:57:57

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

代码语言:javascript
运行
复制
K.set_image_data_format("channels_first") 

代码语言:javascript
运行
复制
K.set_image_data_format("channels_last")

代码语言:javascript
运行
复制
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')

代码语言:javascript
运行
复制
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')

最后,

代码语言:javascript
运行
复制
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)))

代码语言:javascript
运行
复制
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)))

尺寸现在又正确了,问题就解决了。再一次万事大吉=)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60289143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档