Bagaimana cara membuat Tensorflow serve_input_receiver_fn dengan banyak fitur?

Dalam panduan TF tentang menyimpan model terdapat paragraf tentang serve_input_receiver_fn yang membahas tentang penerapan fungsi untuk prapemrosesan logika. Saya mencoba melakukan normalisasi data masukan untuk DNNRegressor. Kode mereka untuk fungsinya terlihat seperti ini:

feature_spec = {'foo': tf.FixedLenFeature(...),
                'bar': tf.VarLenFeature(...)}

def serving_input_receiver_fn():
  """An input receiver that expects a serialized tf.Example."""
  serialized_tf_example = tf.placeholder(dtype=tf.string,
                                         shape=[default_batch_size],
                                         name='input_example_tensor')
  receiver_tensors = {'examples': serialized_tf_example}
  features = tf.parse_example(serialized_tf_example, feature_spec)
  return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)

Kode saya terlihat seperti ini:

feat_cols = [
    tf.feature_column.numeric_column(key="FEATURE1"),
    tf.feature_column.numeric_column(key="FEATURE2")
]

def serving_input_receiver_fn():
    feature_spec = tf.feature_column.make_parse_example_spec(feat_cols)

    default_batch_size = 1

    serialized_tf_example = tf.placeholder(dtype=tf.string, shape=[default_batch_size], name='tf_example')

    receiver_tensors = { 'examples': serialized_tf_example}

    features = tf.parse_example(serialized_tf_example, feature_spec)

    fn_norm1 = lamba FEATURE1: normalize_input_data('FEATURE1', FEATURE1)
    fn_norm2 = lamba FEATURE2: normalize_input_data('FEATURE2', FEATURE2)
    features['FEATURE1'] = tf.map_fn(fn_norm1, features['FEATURE1'], dtype=tf.float32)
    features['FEATURE2'] = tf.map_fn(fn_norm2, features['FEATURE2'], dtype=tf.float32)

    return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)

Setelah semua itu, model yang disimpan tidak memiliki fitur saya di grafik. Saya mencoba mencari tahu cara kerjanya jika Anda memiliki lebih dari satu fitur yang ingin Anda lewati.

Saya membuat contoh menggunakan data keras MPG. Terletak di sini:


person Geoff Craig    schedule 18.01.2019    source sumber
comment
Di mana receiver_tensors didefinisikan?   -  person Siyuan Ren    schedule 18.01.2019
comment
Maaf, lupa kalimat itu. receiver_tensors = { 'examples': serialized_tf_example} Saya akan memperbarui postingan   -  person Geoff Craig    schedule 18.01.2019
comment
Pada satu titik saya memiliki receiver_tensors sebagai dict dengan fitur yang ditentukan. Kode tidak error tetapi ketika saya hendak menyajikannya muncul kesalahan yang mengatakan bahwa saya perlu memberikan nilai untuk tf_example.   -  person Geoff Craig    schedule 18.01.2019
comment
Anda masih belum memberikan banyak konteks. Posting kode MVCE.   -  person Siyuan Ren    schedule 19.01.2019
comment
@SiyuanRen Saya membuat contoh berdasarkan kode keras MPG tetapi memiliki masalah yang sama. Saya perlu mengetahui cara membuat serve_input_receiver_fn yang berfungsi untuk menormalkan data saat menggunakan API Web TF Serving.   -  person Geoff Craig    schedule 22.01.2019
comment
Apa maksud Anda model yang disimpan tidak memiliki fitur apa pun? Apakah Anda ingin, misalnya, memberi makan jaringan bukan dengan proto tf.Example, tetapi memisahkan 'Silinder', 'Perpindahan', ... tensor?   -  person Siyuan Ren    schedule 23.01.2019
comment
Saya ingin menggunakan api web Tensorflow untuk prediksi. Untuk model lain saya hanya meneruskan dokumen JSON seperti: { "signature_name": "predict", "instances":[{ "Cylinders": [4.0], "Displacement": [140.0], "Horsepower": [86.0], "Weight": [2790.0], "Acceleration": [15.6], "Model_Year": [82.0], "USA": [1.0], "Europe": [0.0], "Japan": [0.0] }] }   -  person Geoff Craig    schedule 23.01.2019
comment
Namun saya mendapatkan kesalahan { "error": "Failed to process element: 0 key: Cylinders of \'instances\' list. Error: Invalid argument: JSON object: does not have named input: Cylinders" } Saya berasumsi bahwa saya salah membangun fungsi input penyajian atau saya perlu mengubah payload JSON. Aku hanya tidak tahu yang mana. Akan sangat membantu jika ada contoh end to end, menurut saya siapa pun yang melayani regressor harus melakukan ini.   -  person Geoff Craig    schedule 23.01.2019


Jawaban (1)


features di ServingInputReceiver diteruskan langsung ke fungsi model Anda. Yang Anda inginkan adalah receive_tensors atau receive_tensor_alternatives, yaitu argumen kedua dan ketiga untuk konstruktor ServingInputReceiver.

Misalnya, Anda mungkin melakukan ini

serialized_tf_example = tf.placeholder(dtype=tf.string, shape=[default_batch_size], name='tf_example')

receiver_tensors = { 'examples': serialized_tf_example}

raw_features = tf.parse_example(serialized_tf_example, feature_spec)

fn_norm1 = lamba FEATURE1: normalize_input_data('FEATURE1', FEATURE1)
fn_norm2 = lamba FEATURE2: normalize_input_data('FEATURE2', FEATURE2)
features['FEATURE1'] = tf.map_fn(fn_norm1, raw_features['FEATURE1'], dtype=tf.float32)
features['FEATURE2'] = tf.map_fn(fn_norm2, raw_features['FEATURE2'], dtype=tf.float32)
return tf.estimator.export.ServingInputReceiver(
      features=features,
      receiver_tensors=receiver_tensors,
      receiver_tensors_alternatives={'SOME_KEY': raw_features})

Jika Anda tidak perlu memberi makan jaringan dengan proto Example, Anda dapat melewatinya sepenuhnya.

raw_features = {'FEATURE1': tf.placeholder(...), 'FEATURE2': tf.placeholder(...)}
features = preprepocess(raw_features)
return tf.estimator.export.ServingInputReceiver(features, {'SOME_OTHER_KEY': raw_features})
person Siyuan Ren    schedule 26.01.2019