java - 如何使用 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);
解决方案
推荐阅读
- php - 如何使用 cakephp 生成主键
- android - 如何根据 API 响应触发应用内导航
- android - 是否有任何原因 PeriodicWorkRequest 不在 API 级别 23 上重复?
- html - chrome和IE11之间的html和css对齐
- php - PHP:与其日期对应的组数组
- ios - [__SwiftValue encodeWithCoder:]:发送到实例的无法识别的选择器
- android - 无论如何要下载模拟器图像来为Android Studio手动配置它?
- ios - 如何将 json 转换为字典以进行 POST api 调用 Swift
- django - 如何在 Django 中手动渲染和绑定choiceFile
- text - 如何使用ansible替换文件中的特定行?