在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)
该警告的目的是什么?
答案 0 :(得分:1)
我能够在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
如果您观察到输出警告,则不再出现。