pandas - 当输入是 Pandas 数据框时,为什么 Tensorflow 2 会发出警告(但仍然有效)?

标签 pandas numpy dataframe tensorflow tensorflow2.0

在 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.0 中重现您的问题它在提交中修复,617f788 2019 年 11 月 23 日在 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 - 当输入是 Pandas 数据框时,为什么 Tensorflow 2 会发出警告(但仍然有效)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59165650/

相关文章:

r - 基于两个变量的条件行计数 (R)

python - Pandas 相当于 np.where

python - 将预测结果保存到 CSV

numpy - 从平面列表创建结构化数组

scala - Spark 计数大量列

python - 如何根据行的内容分割pyspark数据帧

python - 添加列数据框

python - 如何计算数据框中一组分组行中前一个的差异

python - Pandas 加载 CSV 比 SQL 更快

python - 如何查找特定值的列号以及该位置的 CSV 文件