2017-10-19 9 views
0

Je fais un clustering K-means en utilisant tensorflow.contrib.learn.KMeansClustering.Exporter un modèle KMeans en utilisant export_savedmodel pour le déployer sur ml-engine

Je peux l'utiliser comme modèle par défaut pour prédire le local mais comme je veux utiliser la prédiction en ligne du moteur de recherche, je dois l'exporter vers un format export_savedmodel.

J'ai beaucoup Google place mais étant donné que la classe k-moyennes n'a pas besoin de colonnes de fonctionnalités, donc je ne sais pas comment construire le serving_input_fn correct pour export_savedmodel

Voici mon code

# Generate input_fn 
def gen_input(data): 
    return tf.constant(data.as_matrix(), tf.float32, data.shape), None 

# Declare dataset + export model path 
TRAIN = 'train.csv' 
MODEL = 'model' 

# Read dataset 
body = pd.read_csv(
    file_io.FileIO(TRAIN, mode='r'), 
    delimiter=',', 
    header=None, 
    engine='python' 
) 

# Declare K-Means 
km = KMeansClustering(
    num_clusters=2, 
    model_dir=MODEL, 
    relative_tolerance=0.1 
) 

est = km.fit(input_fn=lambda: gen_input(body)) 

# This place is where I stuck 
fcols = [tf.contrib.layers.real_valued_column('x', dimension=5)] 
fspec = tf.contrib.layers.create_feature_spec_for_parsing(fcols) 
serving_input_fn = tf.contrib.learn.python.learn.\ 
        utils.input_fn_utils.build_parsing_serving_input_fn(fspec) 
est.export_savedmodel(MODEL, serving_input_fn) 

Voici mon jouet train.csv

1,2,3,4,5 
2,3,4,5,6 
3,4,5,6,7 
5,4,3,2,1 
7,6,5,4,3 
8,7,6,5,4 

modèle exporté ont le format de saved_model.pb avec ses variables dossier

Déploiement du modèle de ml moteur a réussi, mais quand même avec la prédiction train.csv j'ai eu l'erreur suivante

{"error": "Prediction failed: Exception during model execution: AbortionError(code=StatusCode.INVALID_ARGUMENT, details=\"Name: <unknown>, Feature: x (data type: float) is required but could not be found.\n\t [[Node: ParseExample/ParseExample = ParseExample[Ndense=1, Nsparse=0, Tdense=[DT_FLOAT], _output_shapes=-1,5, dense_shapes=5, sparse_types=[], _device=\"/job:localhost/replica:0/task:0/cpu:0\"](_arg_input_example_tensor_0_0, ParseExample/ParseExample/names, ParseExample/ParseExample/dense_keys_0, ParseExample/Const)]]\")"} 

J'ai lutté avec cela pour le mois alors que tous les documents que je trouve sont pour pur API

Je suis impatient de vos conseils

Merci à l'avance

Répondre

1

L'échantillon du recensement shows comment configurez le fichier serving_input_fn pour CSV. Ajusté pour votre exemple:

CSV_COLUMNS = ['feat1', 'feat2', 'feat3', 'feat4', 'feat5'] 
CSV_COLUMN_DEFAULTS = [[0.0],[0.0],[0.0],[0.0],[0.0]] 

def parse_csv(rows_string_tensor): 
    """Takes the string input tensor and returns a dict of rank-2 tensors.""" 

    # Takes a rank-1 tensor and converts it into rank-2 tensor 
    # Example if the data is ['csv,line,1', 'csv,line,2', ..] to 
    # [['csv,line,1'], ['csv,line,2']] which after parsing will result in a 
    # tuple of tensors: [['csv'], ['csv']], [['line'], ['line']], [[1], [2]] 
    row_columns = tf.expand_dims(rows_string_tensor, -1) 
    columns = tf.decode_csv(row_columns, record_defaults=CSV_COLUMN_DEFAULTS) 
    features = dict(zip(CSV_COLUMNS, columns)) 

    return features 

def csv_serving_input_fn(): 
    """Build the serving inputs.""" 
    csv_row = tf.placeholder(
     shape=[None], 
     dtype=tf.string 
) 
    features = parse_csv(csv_row) 
    return tf.contrib.learn.InputFnOps(features, None, {'csv_row': csv_row}) 

# No need for fcols/fspec 
est.export_savedmodel(MODEL, serving_input_fn) 

TensorFlow 1.4 simplifiera au moins une partie de ceci.

En outre, pensez à utiliser JSON, car c'est l'approche la plus standard pour le service. Heureux de fournir des détails sur demande.

+0

Merci beaucoup, cela a fonctionné: D –