当输入是pandas数据框时,为什么Tensorflow 2会发出警告(但仍然可以正常工作)?

时间:2019-12-03 21:30:39

标签: 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一起使用。熊猫非常不可思议,那么为什么TF 2.0假装它不能处理它(即使它显然可以处理)? TF不想为将DataFrame转换为TF.DataSet付出代价而只是效率问题吗?但是TF现在要求我改为执行该转换,那么,这比让TF自己进行转换更有效吗? (此外,与训练过程中数十亿次乘法运算相比,一开始转换熊猫输入的开销肯定可以忽略不计?)

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)

该警告的目的是什么?

1 个答案:

答案 0 :(得分:1)

我能够在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

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