如何在Keras / Tensorflow中将(None)批次尺寸重新引入张量?

时间:2019-03-27 11:04:03

标签: tensorflow keras

我正在尝试使用Keras创建与Google的机器学习引擎兼容的张量流模型。我有一个现有的经过训练的Keras模型,该模型需要向量浮点输入。我在现有模型的前面引入了字符串向量输入层。这将传递要预处理的字符串。我正在尝试使用Lambda层预处理图像数据。在预处理期间,为了解码字符串jpeg数据,我需要从张量中删除批处理尺寸。在预处理之后,我将需要重新引入“无”批处理维度。这就是我面临的问题。似乎没有办法重新引入“无”作为批次尺寸。 Google ML Engine要求在整个模型中,批次维度始终是未知的。

Tensorflow版本:1.12 Keras版本:2.2.4 操作系统:Debian Linux(VM实例) Python版本:2.7

我尝试过: 1.使用[None,299,299,3]以及[-1,299,299,3]来Reshape()。两者都无法正常工作

    如上
  1. 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

预期结果:

输入:Tensor(“ input_1_1:0”,shape =(?, 1),dtype = string)

输出:Tensor(“ model_2 / model_1 / dense_2 / Softmax:0”,shape =(?, 8),dtype = float32)

实际结果:

输入:Tensor(“ input_1_1:0”,shape =(?, 1),dtype = string)

输出:Tensor(“ model_2 / model_1 / dense_2 / Softmax:0”,shape =(1,8),dtype = float32)

1 个答案:

答案 0 :(得分:0)

回答我自己的问题。

诀窍是创建一个具有所需尺寸[None,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