Спасибо :), вы правы, я отправляю 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, кодирующее строки байтов, позволяет мне получать предсказания, хотя при тестировании декодирования локально я думаю, что аудио неправильно конвертируется из строки байтов.