我正在尝试让DCGAN(深度卷积生成对抗网络(与Java的tensorflow一起工作。
我已经在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切片数组的方式,但我不熟悉其中使用的三个点。 我确实在那里阅读了对堆栈溢出问题的引用,它提到它类似于img[:, :, ::-1]
。但我不太确定它到底在做什么。
任何帮助,非常感谢您花时间阅读这篇长文。
基本上imread
和get_image
是 1( 读取图像 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
可以重新缩放图像