web-dev-qa-db-fra.com

Pourquoi Tensorflow 2 donne-t-il un avertissement (mais fonctionne toujours de toute façon) lorsque l'entrée est un pandas dataframe?

Sur Tensorflow 2.0, chaque fois que je passe un Pandas DataFrame comme entrée, alors Tensorflow fonctionne bien mais affiche un avertissement 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'>. Je ne me souviens pas avoir jamais eu cette erreur avec TF 1.x donc cela doit être nouveau. Mais pourquoi est-ce un avertissement?

Je comprends ce qu'il demande, et oui, la conversion de ce DataFrame en un tableau numpy pur fait disparaître l'erreur. Mais pourquoi TF s'en soucie-t-il? Malgré l'avertissement, il est clairement capable de fonctionner correctement avec un DataFrame. Scikit-learn attend également un tableau numpy, mais cela fonctionne bien lorsque vous passez un DataFrame. TF 1.x fonctionnait également très bien avec un DataFrame. Pandas est incroyablement courant, alors pourquoi TF 2.0 prétend-il qu'il ne peut pas le gérer (même s'il le peut clairement)? Est-ce juste une question d'efficacité où TF ne voulait pas payer le coût de convertir ce DataFrame en TF.DataSet? Mais TF me demande maintenant de faire cette conversion à la place, alors en quoi est-ce plus efficace que de laisser TF faire la conversion elle-même? (et en plus, sûrement la surcharge de conversion pandas entrée une seule fois au début est négligeable par rapport aux milliards de multiplications lors de la formation?)

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)

Quel est le but de cet avertissement?

7
user2543623

J'ai pu recréer votre problème dans TF 2.0 et il est corrigé dans le commit, 617f788 le 23 novembre 2019 dans Tensorflow Version 2.1

Veuillez donc mettre à jour votre version Tensorflow vers 2.1 ou 2.2 et le problème sera résolu.

Le code de travail est mentionné ci-dessous:

!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)

Production:

2.2.0
Train on 1000 samples
1000/1000 [==============================] - 0s 411us/sample - loss: 49.0524

Si vous observez, l'avertissement de sortie n'apparaît plus.

1