当输入是 pandas 数据帧时,为啥 Tensorflow 2 会发出警告(但仍然有效)?

Posted

技术标签:

【中文标题】当输入是 pandas 数据帧时,为啥 Tensorflow 2 会发出警告(但仍然有效)?【英文标题】:Why does Tensorflow 2 give a warning (but still work anyway) when the input is a pandas dataframe?当输入是 pandas 数据帧时,为什么 Tensorflow 2 会发出警告(但仍然有效)? 【发布时间】:2020-03-28 15:27:03 【问题描述】:

在 Tensorflow 2.0 上,每当我将 Pandas DataFrame 作为输入传递时,Tensorflow 工作正常,但会打印出警告 WARNING:tensorflow:Falling back from v2 loop because of error: Failed to find data adapter that can handle input: <class 'pandas.core.frame.DataFrame'>, <class 'NoneType'>。我不记得曾经在 TF 1.x 中遇到过这个错误,所以这一定是新的。但为什么是警告呢?

我了解它的要求,是的,将 DataFrame 转换为纯 numpy 数组确实会使错误消失。但是为什么TF在乎呢?尽管有警告,但它显然可以与 DataFrame 一起正常工作。 Scikit-learn 还需要一个 numpy 数组,但是当你传递一个 DataFrame 时它工作得很好。 TF 1.x 也适用于 DataFrame。 Pandas 非常普遍,那么为什么 TF 2.0 假装它无法处理它(即使它显然可以)? TF 不想支付将 DataFrame 转换为 TF.DataSet 的成本,这只是效率问题吗?但是 TF 现在要求我进行转换,那么这比让 TF 自己进行转换更有效率吗? (此外,与训练期间的数十亿次乘法相比,在开始时转换 pandas 输入的开销肯定可以忽略不计?)

import tensorflow as tf
import numpy as np

#Make some fake data
df = pd.DataFrame()
NUM_ROWS = 1000
NUM_FEATURES = 50
random_data = np.random.normal(size=(NUM_ROWS, NUM_FEATURES))
df = pd.DataFrame(data=random_data, columns=['x_' + str(ii) for ii in range(NUM_FEATURES)])
y = df.sum(axis=1) + np.random.normal(size=(NUM_ROWS))

model = tf.keras.Sequential([
            tf.keras.layers.Dense(40, input_dim=df.shape[1], activation='relu'),
            tf.keras.layers.Dense(1, activation='linear')
        ])
NUM_EPOCHS = 500

model.compile(optimizer='adam', loss='mean_squared_error');
hist = model.fit(df, y, epochs=1, verbose=0) ###This gives the warning (but still works fine anyway)

该警告的目的是什么?

【问题讨论】:

我有同样的问题,如果我在 TF 2.1 中运行相同的代码,它会崩溃并烧毁......至少当我喂它 Pandas 时它会运行。如果我使用 .to_numpy() 转换所有内容,它也会在 TF 2.0 中崩溃和烧毁 啊哈! EarlyStopping 监视器似乎与急切执行不兼容。 【参考方案1】:

我能够在 TF 2.0 中重新创建您的问题,并且它已在 2019 年 11 月 23 日的提交中修复,617f788 Tensorflow 版本 2.1

所以,请将您的Tensorflow 版本升级到2.12.2,问题将得到解决。

工作代码如下:

!pip install tensorflow==2.2.0

import tensorflow as tf
import numpy as np
import pandas as pd

print(tf.__version__)

#Make some fake data
df = pd.DataFrame()
NUM_ROWS = 1000
NUM_FEATURES = 50
random_data = np.random.normal(size=(NUM_ROWS, NUM_FEATURES))
df = pd.DataFrame(data=random_data, columns=['x_' + str(ii) for ii in range(NUM_FEATURES)])
y = df.sum(axis=1) + np.random.normal(size=(NUM_ROWS))

model = tf.keras.Sequential([
            tf.keras.layers.Dense(40, input_dim=df.shape[1], activation='relu'),
            tf.keras.layers.Dense(1, activation='linear')
        ])
NUM_EPOCHS = 500

model.compile(optimizer='adam', loss='mean_squared_error')

hist = model.fit(df, y, epochs=1, verbose=1)

输出:

2.2.0
Train on 1000 samples
1000/1000 [==============================] - 0s 411us/sample - loss: 49.0524

如果您观察到输出警告不再出现。

【讨论】:

以上是关于当输入是 pandas 数据帧时,为啥 Tensorflow 2 会发出警告(但仍然有效)?的主要内容,如果未能解决你的问题,请参考以下文章

切片 1 行 pandas 数据帧时,切片变为系列

预期的字符串,int 在大文件上使用 pandas 数据帧时

TypeError: unhashable type: 'numpy.ndarray' 合并来自 BigQuery 的 pandas 数据帧时

在 pandas 中加入数据帧时的内存问题(时间索引)

使用 pandas 在 HDF 中存储包含字符串的数据帧时的谜团

当我合并两个数据帧时,如何防止 Pandas 将我的整数转换为浮点数?