首页 > 解决方案 > 如何使用 Python 训练的模型在 Java/Tensorflow 中添加训练 = True?

问题描述

这个问题已经被问了好几次了,没有任何有用的答案。我打开这个希望可以得到一个明确的答案。这里是同样的问题;link1 , link2 , link3 , link4 , link5 , link6 , link7等。只需在 OS 上搜索training = True,您就会看到几个问题。

主要问题来自当模型具有 Batchnormalization 或 Dropout 层时,必须提供training = True, 来执行预测。

一种简单的模型是GAN。在提供的链接中,生成器模型在 Python 中如下所示:

def make_generator_model():
    model = tf.keras.Sequential()
    model.add(layers.Dense(7*7*256, use_bias=False, input_shape=(100,)))
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())
    model.add(layers.Reshape((7, 7, 256)))
    #assert model.output_shape == (None, 7, 7, 256)  # Note: None is the batch size
    model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False))
    #assert model.output_shape == (None, 7, 7, 128)
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())
    model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))
    #assert model.output_shape == (None, 14, 14, 64)
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())
    model.add(layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))
    assert model.output_shape == (None, 28, 28, 1)
    return model

我已将模型保存为,generator.save("ganModel")并且可以简单地将模型加载为; generator = tf.keras.models.load_model("ganModel").

现在可以进行如下预测;

test_input = tf.random.normal([1,100])

prediction = generator(test_input, training = True) # training has to be set True, otherwise all values are nan or zeros!

现在,当人们尝试使用以下模型在 Java 中执行预测时,问题就开始了。Java代码;

    TFloat32 input = TFloat32.tensorOf(Shape.of(1,100));
System.out.println(input.shape());

SavedModelBundle theModel = SavedModelBundle.load("ganModel", "serve");

Graph gp = theModel.graph();
java.util.Iterator<Operation> theOps = gp.operations();
while(theOps.hasNext()) {
    Operation theOp = theOps.next();
    System.out.println(theOp);
}

Session theSess = theModel.session();
TFloat32 result = (TFloat32) theSess.runner().feed("serving_default_dense_input", input).fetch("StatefulPartitionedCall").run().get(0);
float[][][][] flt = StdArrays.array4dCopyOf(result);
BufferedImage bfImage = new BufferedImage(28,28, BufferedImage.TYPE_INT_RGB);
for(int i = 0; i < 28; i++) {
    for(int j = 0; j < 28; j++) {
        int RdC = (int) ((int) (flt[0][i][j][0]+1)*127.5);
        int GrC = 0;
        int BlC = 0;
        Color theColor = new Color(RdC, GrC, BlC);
        bfImage.setRGB(i, j, theColor.getRGB());
    }
}

File output = new File("bfImage.png");
try {
    ImageIO.write(bfImage, "PNG", output);
} catch (IOException e) {
    e.printStackTrace();
}

正如我在上面分享的几个链接一样,有几个关于这个问题的问题,但没有答案,尤其是在 TF2 中。问题是如何在 tensorflow/java 中设置训练 True 进行预测?我认为可以提供标量布尔张量,但是如何提供呢?TBool tfBool = TBool.scalarOf(true);

标签: javapythontensorflowmachine-learningprediction

解决方案


推荐阅读