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'>
を出力します。TF1でそのエラーが発生したことは覚えていません。 .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
出力を確認すると、警告は表示されなくなります。