Tensorflow 数据适配器错误:ValueError:无法找到可以处理输入的数据适配器

Posted

技术标签:

【中文标题】Tensorflow 数据适配器错误:ValueError:无法找到可以处理输入的数据适配器【英文标题】:Tensorflow Data Adapter Error: ValueError: Failed to find data adapter that can handle input 【发布时间】:2020-01-12 10:13:51 【问题描述】:

在运行加密货币 RNN 的 sentdex 教程脚本时,请在此处链接

YouTube Tutorial: Cryptocurrency-predicting RNN Model,

但在尝试训练模型时遇到错误。我的 tensorflow 版本是 2.0.0,我正在运行 python 3.6。尝试训练模型时收到以下错误:

File "C:\python36-64\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 734, in fit
    use_multiprocessing=use_multiprocessing)

File "C:\python36-64\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 224, in fit
    distribution_strategy=strategy)

File "C:\python36-64\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 497, in _process_training_inputs
    adapter_cls = data_adapter.select_data_adapter(x, y)

File "C:\python36-64\lib\site-packages\tensorflow_core\python\keras\engine\data_adapter.py", line 628, in select_data_adapter
    _type_name(x), _type_name(y)))

ValueError: Failed to find data adapter that can handle input: <class 'numpy.ndarray'>, (<class 'list'> containing values of types "<class 'numpy.float64'>")

任何建议将不胜感激!

【问题讨论】:

【参考方案1】:

您是否检查过您的训练/测试数据和训练/测试标签是否都是 numpy 数组?可能是您将 numpy 数组与列表混合在一起。

【讨论】:

【参考方案2】:

您可以通过在调用model.fit() 之前将标签转换为数组来避免此错误:

train_x = np.asarray(train_x)
train_y = np.asarray(train_y)
validation_x = np.asarray(validation_x)
validation_y = np.asarray(validation_y)

【讨论】:

【参考方案3】:

我遇到了类似的问题。在我的情况下,我使用的是tf.keras.Sequential 模型但keras 生成器是一个问题。

错误:

from keras.preprocessing.sequence import TimeseriesGenerator
gen = TimeseriesGenerator(...)

正确:

gen = tf.keras.preprocessing.sequence.TimeseriesGenerator(...)

【讨论】:

这里有什么区别? 一个使用普通的keras,另一个使用tf.keras。【参考方案4】:

如果您在处理继承自 keras.utils.Sequence 类的 自定义生成器 时遇到此问题,您可能必须确保不要混合使用 Kerastensorflow - Keras-进口。 当您必须切换到以前的 tensorflow 版本以实现兼容性时(例如使用 cuDNN),这种情况尤其可能发生。

例如,如果您将其与 tensorflow-version > 2 一起使用...

from keras.utils import Sequence

class generatorClass(Sequence):

    def __init__(self, x_set, y_set, batch_size):
        ...

    def __len__(self):
        ...

    def __getitem__(self, idx):
        return ...

...但是您实际上尝试将此生成器安装在tensorflow-version Sequence-class,例如:

keras = tf.compat.v1.keras
Sequence = keras.utils.Sequence

class generatorClass(Sequence):

    ...

【讨论】:

这也是我的情况,keras 是通过from keras import layersimport tensorflow.keras 等语句直接导入的。确保与在每个 keras 导入或删除它之前添加 tensorflow. 的导入保持一致。【参考方案5】:

可能会对某人有所帮助。 首先检查您的数据类型是否为 numpy 数组,并且您的算法可能需要 DF。

print(X.shape, X.dtype)
print(y.shape, y.dtype)

将您的 numpy 数组转换为 Pandas DF

train_x = pd.DataFrame(train_x)
train_y = pd.DataFrame(train_y)

【讨论】:

我不明白 Keras 如何接受 pandas.DataFrame 但不接受 numpy.ndarray【参考方案6】:

当我将 tensorflow 从 1.x 更新到 2.x 时出现此错误 更改我的导入后解决了

import keras 

import tensorflow.keras as keras

【讨论】:

以上是关于Tensorflow 数据适配器错误:ValueError:无法找到可以处理输入的数据适配器的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow 自定义分配器和从 Tensor 访问数据

c++ 适配器通过 emcc 用于 tensorflow.js

Tensorflow 耗尽 GPU 内存:分配器 (GPU_0_bfc) 尝试分配内存不足

3070ti 用啥版本的cuda,cudnn,以及tensorflow-gpu可以适配?

windows 下 TensorFlow(GPU 版)的安装

tensorflow 加载数据:错误的元帅数据