0

我正在尝试让DCGAN (Deep Convolutional Generative Adversarial Networks) 与tensorflow for Java一起工作。

我已将必要的代码添加到 DCGAN 的model.py中,如下所示,以输出一个图形,以便稍后在 Java 的 tensorflow 中使用。

//at the beginning to define where the model will be saved
    #
    self.load_dir = load_dir
    self.models_dir = models_dir

    graph = tf.Graph()
    self.graph = graph

    self.graph.as_default()
    #
//near the end where the session is ran in order to build and save the model to be used in tensorflow for java. A model is saved every 200 samples as defined by DCGAN’s default settings.
    #
    steps = "training_steps-" + "{:08d}".format(step)
    set_models_dir = os.path.join(self.models_dir, steps)
    builder = tf.saved_model.builder.SavedModelBuilder(set_models_dir)
    self.builder = builder
    self.builder.add_meta_graph_and_variables(self.sess, [tf.saved_model.tag_constants.SERVING])
    self.builder.save()
    #

上面的代码输出了一个由下面的 Java 代码加载的图

package Main;

import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Random;

import javax.imageio.ImageIO;

import org.tensorflow.Tensor;

public class DCGAN {
    public static void main(String[] args) throws Exception {
        String model_dir = "E:\\AgentWeb\\mnist-steps\\training_steps-00050000";
        //SavedModelBundle model = SavedModelBundle.load(model_dir , "serve");
        //Session sess = model.session();

        Random rand = new Random();
        int sample_num = 64;
        int z_dim = 100;
        float [][] gen_random = new float [64][100];
        for(int i = 0 ; i < sample_num ; i++) {
            for(int j = 0 ; j < z_dim ; j++) {
                gen_random[i][j] = (float)rand.nextGaussian();
            }
        }
        Tensor <Float> sample_z = Tensor.<Float>create(gen_random, Float.class);


        Tensor <Float> sample_inputs = Tensor.<Float>create(placeholder, Float.class);
// placeholder is the tensor which I want to create after solving the problem below.

        //Tensor result = sess.runner().fetch("t_vars").feed("z", sample_z).feed("inputs", sample_inputs).run().get(3);
    }
}

(我在调试时留下了一些评论)

使用这种方法,我被困在将 python 代码转换为 Java 以用于 Java 的 tensorflow 的某个部分。在处理图像的 DCGAN 的model.py中有以下代码。

          get_image(sample_file,
                    input_height=self.input_height,
                    input_width=self.input_width,
                    resize_height=self.output_height,
                    resize_width=self.output_width,
                    crop=self.crop,
                    grayscale=self.grayscale) for sample_file in sample_files]

在 saved_utils.py中调用get_iamge如下

def get_image(image_path, input_height, input_width,
              resize_height=64, resize_width=64,
              crop=True, grayscale=False):
  image = imread(image_path, grayscale)
  return transform(image, input_height, input_width,
                   resize_height, resize_width, crop)

然后调用一个名为imread的方法,如下所示

def imread(path, grayscale = False):
  if (grayscale):
    return scipy.misc.imread(path, flatten = True).astype(np.float)
  else:
    # Reference: https://github.com/carpedm20/DCGAN-tensorflow/issues/162#issuecomment-315519747
    img_bgr = cv2.imread(path)
    # Reference: https://stackoverflow.com/a/15074748/
    img_rgb = img_bgr[..., ::-1]
    return img_rgb.astype(np.float)

我的问题是我不确定该img_rgb = img_bgr[..., ::-1] 部分的作用以及如何翻译它以在 tensorflow.java 中的 Java 文件中使用。

我熟悉 python 切片数组的方式,但我不熟悉其中使用的三个点。我确实在那里阅读了对stackoverflow 问题的引用,它提到它类似于img[:, :, ::-1]. 但我不太确定它到底在做什么。

感谢您提供任何帮助,并感谢您花时间阅读这篇长文。

4

1 回答 1

0

基本上做的imreadget_image1) 读取图像 2) 将其从 BGR 转换为 RGB 3) 将其转换为浮点数 4) 重新缩放图像

您可以在 Java 中使用成像库(如 JMagick 或 AWT)或使用 TensorFlow 来执行此操作。

如果您使用 TensorFlow,则可以在 Eager 模式下或通过构建和运行一个小图来运行此预处理。例如,给定tf一个实例org.tensorflow.op.Ops

  • tf.image.decode*可以读取图像的内容(尽管选择正确的操作,但您知道知道图像的类型)。
  • tf.reverse可以反转通道维度中的值(RGB 到 BGR)
  • tf.dtypes.cast可以将图像转换为浮点数
  • tf.image.resizeBilinear可以重新缩放您的图像
于 2020-01-16T18:50:25.933 回答