Как повторно ввести (Нет) размерность партии в тензор в Keras / Tensorflow? - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь создать модель тензорного потока с использованием Keras, совместимого с Google Machine Learning Engine.У меня есть существующая обученная модель Keras, которая принимает входные данные векторного типаЯ представляю входной векторный слой строки в передней части существующей модели.Это передаст строку для предварительной обработки.Я пытаюсь предварительно обработать данные изображения, используя лямбда-слой.Во время предварительной обработки, чтобы декодировать строковые данные в формате jpeg, мне нужно удалить пакетное измерение из тензора.После предварительной обработки мне потребуется повторно ввести размер партии «Нет».Это где я сталкиваюсь с проблемой.Кажется, нет никакого способа вновь ввести «Нет» в качестве измерения партии.Google ML Engine требует, чтобы размер пакета был неизвестен на протяжении всей модели.

Версия Tensorflow: 1.12 Версия Keras: 2.2.4 ОС: Debian Linux (экземпляр VM) Версия Python: 2.7

Я пробовал: 1. Изменить форму () как с [Нет, 299,299,3], так и с [-1,299,299,3].Оба не работают должным образом

tf.reshape, как указано выше.Не работает.
img_height=299
img_width=299
inputs = Input(shape=[1],dtype=tf.string)
inputs_inter1 = Lambda(preprocess_input, output_shape=(img_height,img_width,3))(inputs)
print(inputs_inter1.shape)

print("Combining with string vector input")
combine_out = trainedmodel(inputs_inter1)     
Combinedmodel = Model(inputs,combine_out)
input_tensor = Combinedmodel.inputs[0]
output_tensor = Combinedmodel.outputs[0]
print("Inputs: "+str(input_tensor))
print("Outputs: "+str(output_tensor))
def preprocess_input(x):

    import tensorflow as tf

    x=tf.reshape(x,())
    x = tf.image.decode_jpeg(x,channels=3)
    x = tf.image.resize_images(x,(299,299))
    x = tf.cast(x, tf.float32)
    x = tf.math.divide(x, 255.0)
    x = tf.math.subtract(x, 0.5)
    x = tf.math.multiply(x, 2.0)
    x = tf.expand_dims(x,0)    
return x

Ожидаемый результат:

Входные данные: Тензор ("input_1_1: 0", shape = (?, 1), dtype = string)

Выходы: Тензор ("модель_2 / модель_1 / плотность_2 / Softmax: 0", форма = (?, 8), dtype = float32)

Фактический результат:

Входы: Тензор ("input_1_1: 0", shape = (?, 1), dtype = string)

Выходы: Тензор ("model_2 / model_1 / density_2 / Softmax: 0", shape = (1, 8), dtype = float32)

1 Ответ

0 голосов
/ 31 марта 2019

Отвечая на мой вопрос.

Хитрость в том, чтобы создать новый заполнитель с необходимыми размерами [Нет, 299,299,3], скопировать в него предварительно обработанный тензор и вернуть этот заполнитель из функции / слоя Lambda.

def preprocess_input(x):

    import tensorflow as tf

    x=tf.reshape(x,())
    x = tf.image.decode_jpeg(x,channels=3)
    x = tf.image.resize_images(x,(299,299))
    x = tf.cast(x, tf.float32)
    x = tf.math.divide(x, 255.0)
    x = tf.math.subtract(x, 0.5)
    x = tf.math.multiply(x, 2.0)

    x = tf.placeholder_with_default(x,[None,299,299,3])

    return x

Использование tf.placeholder_with_default можно найти здесь: https://www.tensorflow.org/api_docs/python/tf/placeholder_with_default

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...