我使用 python、keras 和 tensorflow 在 PC 上开发并训练了一个模型,并使用 GPU 运行预测等。一切正常。
然后,我将模型和预测代码转移到笔记本电脑上,并使用requirements.txt重建环境,将gpu包交换为cpu包。
当我尝试运行预测代码时,我收到一个我无法理解的错误。
我的印象是张量流会透明地使用/不使用 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
任何帮助,将不胜感激!!
Updated:
我使用的版本: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]