estimator.predict genera “ValueError: ninguno de los valores no es compatible”

Así que básicamente copié el código del tutorial de tensorflow adaptado a este modelo:

https://gormanalysis.com/wp-content/uploads/2017/11/intro-to-nnets_sketch2-3.png

Que intenta modelar una neural network para identificar la forma de “escaleras”, como se muestra aquí:

import numpy as np import tensorflow as tf import _pickle as cPickle with open("var_x.txt", "rb") as fp: # Unpickling var_x = cPickle.load(fp) with open("var_y.txt", "rb") as fp: # Unpickling var_y = cPickle.load(fp) # Declare list of features, we only have one real-valued feature def model_fn(features, labels, mode): # Build a linear model and predict values W = tf.get_variable("W", [4], dtype=tf.float64) b = tf.get_variable("b", [1], dtype=tf.float64) y = tf.sigmoid( W*features['x'] + b) # Loss sub-graph loss = tf.reduce_sum(tf.square(y - labels)) # Training sub-graph global_step = tf.train.get_global_step() optimizer = tf.train.GradientDescentOptimizer(0.01) train = tf.group(optimizer.minimize(loss), tf.assign_add(global_step, 1)) # EstimatorSpec connects subgraphs we built to the # appropriate functionality. return tf.estimator.EstimatorSpec( mode=mode, predictions=y, loss=loss, train_op=train) estimator = tf.estimator.Estimator(model_fn=model_fn) # define our data sets x_train = np.array(var_x) y_train = np.array(var_y) input_fn = tf.estimator.inputs.numpy_input_fn( {"x": x_train}, y_train, batch_size=4, num_epochs=10, shuffle=True) # train estimator.train(input_fn=input_fn, steps=1000) # Here we evaluate how well our model did. print(estimator.get_variable_value("b")) print(estimator.get_variable_value("W")) new_samples = np.array( [255., 1., 255., 255.], dtype=np.float64) predict_input_fn = tf.estimator.inputs.numpy_input_fn( x={"x": new_samples}, num_epochs=1, shuffle=False) predictions = list(estimator.predict(input_fn=predict_input_fn)) print(predictions) 

El problema es que cuando trato de predecir una figura que claramente debería ser una escalera: [255., 1., 255., 255.] Me sale un “Valor de error: Ninguno de los valores no es compatible”. El entrenamiento funciona bien (a excepción de los hechos que los pesos que encuentra no son muy similares a los de aquí: http://blog.kaggle.com/2017/11/27/introduction-to-neural-networks/ ). Pero el método de predicción no funciona. Este código debe ser simplemente una copia del ejemplo de tensorflow, adaptado a un vector de cuatro dimensiones para x.

En su model_fn , usted define la loss en cada modo (train / eval / predict). Esto significa que incluso en el modo de predicción, las labels se utilizarán y deberán proporcionarse.

Cuando está en modo de predicción, en realidad solo necesita devolver las predicciones para poder regresar antes de la función:

 def model_fn(features, labels, mode): #... y = ... if mode == tf.estimator.ModeKeys.PREDICT: return tf.estimator.EstimatorSpec(mode=mode, predictions=y) #... 

Por cierto, las W * features devuelven un tensor de forma (4,) , tendrá que sumrlo antes de agregar el sesgo.