web-dev-qa-db-ja.com

入力がpandas dataframeである場合にTensorflow 2が警告を出します(それでも動作します)のはなぜですか?

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)

その警告の目的は何ですか?

7
user2543623

私は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

出力を確認すると、警告は表示されなくなります。

1