在 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.1
或 2.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/