Спасибо :), вы правы, я отправляю JSON, чтобы делать прогнозы. То, что вы предложили, работает локально для чтения байтовых строк (когда я добавляю decode (utf-8)), но не в функции ввода, выполняемой моим оценщиком. Я обновил ОП, чтобы объяснить, почему. Из того, что я вижу, синтаксический анализ должен делать gcloud автоматически (если я правильно понял ваш ответ) не так, как ожидалось.
аюсь преобразовать закодированную строку байтов обратно в исходный массив на графике тензорного потока (используя операции тензорного потока), чтобы сделать прогноз в модели тензорного потока. Преобразование массива в байты основано наэтот ответ и это предлагаемый вклад в прогноз модели тензорного потока на мл-движке облака Google.
def array_request_example(input_array):
input_array = input_array.astype(np.float32)
byte_string = input_array.tostring()
string_encoded_contents = base64.b64encode(byte_string)
return string_encoded_contents.decode('utf-8')}
Код тензорного потока
byte_string = tf.placeholder(dtype=tf.string)
audio_samples = tf.decode_raw(byte_string, tf.float32)
audio_array = np.array([1, 2, 3, 4])
bstring = array_request_example(audio_array)
fdict = {byte_string: bstring}
with tf.Session() as sess:
[tf_samples] = sess.run([audio_samples], feed_dict=fdict)
Я пытался использоватьdecode_raw а такжеdecode_base64 но ни вернуть исходные значения.
Я попытался установить out_type для decode raw для различных возможных типов данных и попытался изменить тип данных, в который я преобразовываю исходный массив.
Итак, как бы я прочитал байтовый массив в tenorflow? Спасибо :)
Дополнительная информацияЦель этого состоит в том, чтобы создать обслуживающую функцию ввода для пользовательского оценщика, который будет делать прогнозы, используя локальный прогноз gcloud-engine (для тестирования) и используя REST API для модели, хранящейся в облаке.
Функция входного обслуживания для Оценщика
def serving_input_fn():
feature_placeholders = {'b64': tf.placeholder(dtype=tf.string,
shape=[None],
name='source')}
audio_samples = tf.decode_raw(feature_placeholders['b64'], tf.float32)
# Dummy function to save space
power_spectrogram = create_spectrogram_from_audio(audio_samples)
inputs = {'spectrogram': power_spectrogram}
return tf.estimator.export.ServingInputReceiver(inputs, feature_placeholders)
JSON запросЯ использую .decode ('utf-8'), потому что при попытке json сбросить строки байтов в кодировке base64 я получаю эту ошибку
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: b'longbytestring'
Ошибки предсказанияПри передаче запроса json {'audio_bytes': 'b64': bytestring} с помощью gcloud local я получаю сообщение об ошибке
PredictionError: Invalid inputs: Expected tensor name: b64, got tensor name: [u'audio_bytes']
Таким образом, возможно, локальный прогноз Google Cloud не обрабатывает автоматически байты аудио и преобразование base64? Или, возможно, что-то не так с моей настройкой оценщика.
И запрос {'instances': [{'audio_bytes': 'b64': bytestring}]} к REST API дает
{'error': 'Prediction failed: Error during model execution: AbortionError(code=StatusCode.INVALID_ARGUMENT, details="Input to DecodeRaw has length 793713 that is not a multiple of 4, the size of float\n\t [[Node: DecodeRaw = DecodeRaw[_output_shapes=[[?,?]], little_endian=true, out_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_source_0_0)]]")'}
что смущает меня, так как я явно определяю запрос как число с плавающей точкой и делаю то же самое в обслуживающем входном приемнике.
Удаление audio_bytes из запроса и utf-8, кодирующее строки байтов, позволяет мне получать предсказания, хотя при тестировании декодирования локально я думаю, что аудио неправильно конвертируется из строки байтов.