【问题标题】:Default MaxPoolingOp only supports NHWC on device type CPU error when using trained model ported from GPU使用从 GPU 移植的训练模型时,默认 MaxPoolingOp 仅支持设备类型 CPU 错误上的 NHWC
【发布时间】:2021-02-16 01:28:19
【问题描述】:

我使用 python、keras 和 tensorflow 在 PC 上开发并训练了一个模型,并使用 GPU 运行预测等。一切正常。

然后我将模型和预测代码带到一台笔记本电脑上,并使用 requirements.txt 重建了将 gpu 包交换为 cpu 包的环境。

当我尝试运行预测代码时,我得到一个我无法理解的错误。

我的印象是 tensorflow 会透明地使用/不使用 GPU,所以我想知道它还能是什么。

    Traceback (most recent call last):
  File ".\metatrader.py", line 231, in <module>
    result = predict(ret[0] + filename)
  File ".\metatrader.py", line 104, in predict
    array = model.predict(x)
  File "C:\Users\antho\.conda\envs\tensorflow\lib\site-packages\tensorflow\python\keras\engine\training.py", line 130, in _method_wrapper
    return method(self, *args, **kwargs)
  File "C:\Users\antho\.conda\envs\tensorflow\lib\site-packages\tensorflow\python\keras\engine\training.py", line 1599, in predict
    tmp_batch_outputs = predict_function(iterator)
  File "C:\Users\antho\.conda\envs\tensorflow\lib\site-packages\tensorflow\python\eager\def_function.py", line 780, in __call__
    result = self._call(*args, **kwds)
  File "C:\Users\antho\.conda\envs\tensorflow\lib\site-packages\tensorflow\python\eager\def_function.py", line 846, in _call
    return self._concrete_stateful_fn._filtered_call(canon_args, canon_kwds)  # pylint: disable=protected-access
  File "C:\Users\antho\.conda\envs\tensorflow\lib\site-packages\tensorflow\python\eager\function.py", line 1843, in _filtered_call
    return self._call_flat(
  File "C:\Users\antho\.conda\envs\tensorflow\lib\site-packages\tensorflow\python\eager\function.py", line 1923, in _call_flat
    return self._build_call_outputs(self._inference_function.call(
  File "C:\Users\antho\.conda\envs\tensorflow\lib\site-packages\tensorflow\python\eager\function.py", line 545, in call
    outputs = execute.execute(
  File "C:\Users\antho\.conda\envs\tensorflow\lib\site-packages\tensorflow\python\eager\execute.py", line 59, in quick_execute
    tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
tensorflow.python.framework.errors_impl.InvalidArgumentError:  Default MaxPoolingOp only supports NHWC on device type CPU
         [[node sequential/max_pooling2d_1/MaxPool (defined at .\metatrader.py:104) ]] [Op:__inference_predict_function_445]

Function call stack:
predict_function

任何帮助将不胜感激!

更新:

我正在使用的版本:tensorflow==2.3.1

经过进一步的摆弄后,我发现训练也不能在仅 CPU 的系统上运行,但在 GPU 系统上运行良好。我预计这是与以前版本的一些不兼容,我还没有完全掌握。

import os
import sys
from tensorflow.keras import optimizers
from tensorflow.keras.layers import Dropout, Flatten, Dense, Activation, BatchNormalization
import tensorflow.keras.layers as lyrs
from tensorflow.keras.models import Sequential
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.preprocessing import image
import numpy as np
import tensorflow as tf

epochs = 100

train_data_dir = './data/train/'
validation_data_dir = './data/validate/'

nb_train_samples = sum([len(files) for r, d, files in os.walk(train_data_dir)])
nb_validation_samples = sum([len(files) for r, d, files in os.walk(validation_data_dir)])

nb_filters1 = 32
nb_filters2 = 32
nb_filters3 = 64
conv1_size = 3
conv2_size = 2
conv3_size = 5
pool_size = 2
classes_num = 2
batch_size = 128
chanDim =3

model = Sequential()
model.add(lyrs.Conv2D(nb_filters1, (conv1_size, conv1_size), input_shape=(150, 150, 3), padding='same'))
model.add(Activation('relu'))
model.add(lyrs.MaxPooling2D(pool_size=(pool_size, pool_size)))
model.add(lyrs.Conv2D(nb_filters2, (conv2_size, conv2_size), padding="same"))
model.add(Activation('relu'))
model.add(lyrs.MaxPooling2D(pool_size=(pool_size, pool_size), data_format="channels_first"))
model.add(lyrs.Conv2D(nb_filters3, (conv3_size, conv3_size), padding='same'))
model.add(Activation('relu'))
model.add(lyrs.MaxPooling2D(pool_size=(pool_size, pool_size), data_format="channels_first"))
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(classes_num, activation='softmax'))
model.summary()

model.compile(loss='categorical_crossentropy',
                      optimizer=optimizers.RMSprop(),
                      metrics=['accuracy'])

train_datagen = ImageDataGenerator(
    horizontal_flip=False)

test_datagen = ImageDataGenerator(
    horizontal_flip=False)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(150, 150),
    batch_size=batch_size,
    class_mode='categorical'
)

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(150, 150),
    batch_size=batch_size,
    class_mode='categorical')
    
model.fit_generator(
    train_generator,
    steps_per_epoch=nb_train_samples//batch_size,
    epochs=epochs,
    shuffle=True,
    validation_data=validation_generator,
    validation_steps=nb_validation_samples//batch_size)

model.save('./my_model.hdf5', overwrite=True)

我得到的错误:

tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
tensorflow.python.framework.errors_impl.InvalidArgumentError:  Default MaxPoolingOp only supports NHWC on device type CPU
         [[node sequential/max_pooling2d_1/MaxPool (defined at .\sample-training.py:72) ]] [Op:__inference_train_function_1065]

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    好吧,我终于找到了答案。

    在 tensorfol0w 2.3.1 中的某处似乎与如何在 GPU 和仅 CPU 系统上训练模型有关。

    当在纯 CPU 系统上尝试预测时,由 GPU 系统创建和保存的模型将不起作用。

    虽然上述代码在具有相同 tensorflow 版本的 GPU 系统上运行良好,但在 CPU 系统和任何由 ​​GPU PC 创建/保存的模型(仅在 CPU 上用于预测时)会失败并出现上述错误系统也失败了。

    更改以下行可以解决问题

    model.add(lyrs.MaxPooling2D(pool_size=(pool_size, pool_size), data_format="channels_first"))
    

    到:

    model.add(lyrs.MaxPooling2D(pool_size=(pool_size, pool_size), data_format="channels_last"))
    

    我还不清楚这到底是做什么的,但它也几乎是可训练元素数量的 1/2。

    由于我是该领域的新手,任何有启发性的话请随时发表评论或在我错的地方/地方纠正我。

    【讨论】:

    • 我已经在 GPU 上使用 data_format=channels_first 训练了我的模型,当我将它保存到 h5 文件并将其加载到另一台没有 GPU 的 PC 以仅使用 CPU 运行测试时,它给了我这个错误,是除了更改data_format,还有其他解决方案吗?你试过别的吗?
    猜你喜欢
    • 2021-04-19
    • 2022-06-14
    • 2017-06-17
    • 1970-01-01
    • 2021-01-15
    • 2020-09-26
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多