2017-06-16 215 views
0

我有像Inception-v3这样的预训练模型。我想删除输出图层并将其用于图像认知。下面是张量流给出的例子:如何使用TensorFlow java api删除预训练模型的输出层?

就像python框架Keras一样,它有一个像model.layers.pop()这样的方法。我试着用tensorflow java api来做。首先,我试图用dl4j,但是当我进口keras模型,我得到了这样的错误:

2017-06-15 21:15:43 INFO KerasInceptionV3Net:52 - Importing Inception model from data/inception-model.json 
2017-06-15 21:15:43 INFO KerasInceptionV3Net:53 - Importing Weights model from data/inception_v3_complete 
Exception in thread "main" java.lang.RuntimeException: Unknown exception. 
at org.bytedeco.javacpp.hdf5$H5File.allocate(Native Method) 
at org.bytedeco.javacpp.hdf5$H5File.<init>(hdf5.java:12713) 
at org.deeplearning4j.nn.modelimport.keras.Hdf5Archive.<init>(Hdf5Archive.java:61) 
at org.deeplearning4j.nn.modelimport.keras.KerasModel$ModelBuilder.weightsHdf5Filename(KerasModel.java:603) 
at org.deeplearning4j.nn.modelimport.keras.KerasModelImport.importKerasModelAndWeights(KerasModelImport.java:176) 
at edu.usc.irds.dl.dl4j.examples.KerasInceptionV3Net.<init>(KerasInceptionV3Net.java:55) 
at edu.usc.irds.dl.dl4j.examples.KerasInceptionV3Net.main(KerasInceptionV3Net.java:108) 
HDF5-DIAG: Error detected in HDF5 (1.10.0-patch1) thread 0: 
#000: C:\autotest\HDF5110ReleaseRWDITAR\src\H5F.c line 579 in H5Fopen(): unable to open file 
major: File accessibilty 
minor: Unable to open file 
#001: C:\autotest\HDF5110ReleaseRWDITAR\src\H5Fint.c line 1100 in H5F_open(): unable to open file: time = Thu Jun 15 21:15:44 2017,name = 'data/inception_v3_complete', tent_flags = 0 
major: File accessibilty 
minor: Unable to open file 
#002: C:\autotest\HDF5110ReleaseRWDITAR\src\H5FD.c line 812 in H5FD_open(): open failed 
major: Virtual File Layer 
minor: Unable to initialize object 
#003: C:\autotest\HDF5110ReleaseRWDITAR\src\H5FDsec2.c line 348 in H5FD_sec2_open(): unable to open file: name = 'data/inception_v3_complete', errno = 2, error message = 'No such file or directory', flags = 0, o_flags = 0 
major: File accessibilty 
minor: Unable to open file 

于是我又回到tensorflow。我将在keras中修改模型并将模型转换为张量。这里是我的转换脚本:

input_fld = './' 
output_node_names_of_input_network = ["pred0"] 
write_graph_def_ascii_flag = True 
output_node_names_of_final_network = 'output_node' 
output_graph_name = 'test2.pb' 
from keras.models import load_model 
import tensorflow as tf 
import os 
import os.path as osp 
from keras.applications.inception_v3 import InceptionV3 
from keras.applications.vgg16 import VGG16 
from keras.models import Sequential 
from keras.layers.core import Flatten, Dense, Dropout 
from keras.layers.convolutional import Convolution2D, MaxPooling2D, ZeroPadding2D 
from keras.optimizers import SGD 
output_fld = input_fld + 'tensorflow_model/' 
if not os.path.isdir(output_fld): 
    os.mkdir(output_fld) 
net_model = InceptionV3(weights='imagenet', include_top=True) 
num_output = len(output_node_names_of_input_network) 
pred = [None]*num_output 
pred_node_names = [None]*num_output 
for i in range(num_output): 
    pred_node_names[i] = output_node_names_of_final_network+str(i) 
    pred[i] = tf.identity(net_model.output[i], name=pred_node_names[i]) 
print('output nodes names are: ', pred_node_names) 
from keras import backend as K 
sess = K.get_session() 

if write_graph_def_ascii_flag: 
    f = 'only_the_graph_def.pb.ascii' 
    tf.train.write_graph(sess.graph.as_graph_def(), output_fld, f, as_text=True) 
print('saved the graph definition in ascii format at: ', osp.join(output_fld, f)) 
from tensorflow.python.framework import graph_util 
from tensorflow.python.framework import graph_io 

constant_graph = graph_util.convert_variables_to_constants(sess, sess.graph.as_graph_def(), pred_node_names) 
graph_io.write_graph(constant_graph, output_fld, output_graph_name, as_t ext=False) 
print('saved the constant graph (ready for inference) at: ', osp.join(output_fld, output_graph_name)) 

我得到的模型.pb文件,但是当我把它变成了张量例如,The LabelImage example,我得到这个错误:

Exception in thread "main" java.lang.IllegalArgumentException: You must feed a value for placeholder tensor 'batch_normalization_1/keras_learning_phase' with dtype bool 
[[Node: batch_normalization_1/keras_learning_phase = Placeholder[dtype=DT_BOOL, shape=<unknown>, _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 
at org.tensorflow.Session.run(Native Method) 
at org.tensorflow.Session.access$100(Session.java:48) 
at org.tensorflow.Session$Runner.runHelper(Session.java:285) 
at org.tensorflow.Session$Runner.run(Session.java:235) 
at com.dlut.cmh.sheng.LabelImage.executeInceptionGraph(LabelImage.java:98) 
at com.dlut.cmh.sheng.LabelImage.main(LabelImage.java:51) 

我不知道如何解决这个问题。谁能帮我?或者你有另一种方式来做到这一点?

+0

我不会添加它作为一个答案,但会发表评论,因为你正在使用deeplearning4j。你使用了什么版本的deeplearning4j?我们已在最新版本中修复了大量模型导入问题。 apache tika项目使用它很好。你能否在一个问题上给我们一些反馈,而不仅仅是转换?谢谢!如果你看看我们的例子,我们的转换学习api就可以处理这个问题。 –

+0

@AdamGibson我在GITTER中问过这个问题,并提出了一个问题[iuuse](https://github.com/deeplearning4j/deeplearning4j/issues/3520)。我遵循了这些建议,下载了他给出的新演示。但是当我运行这个演示时,我有这个例外[gist](https://gist.github.com/MoriatyC/cfc48614523ed559e6b6761ef8c559ff)。 QQ群中的人表示,由于keras2模型,许多演示无法成功运行。但我在演示中使用了模型,我不知道keras1模型和keras2模型之间的区别。 –

+0

下载keras 1.x并在那里试试,它应该运行良好。 –

回答

0

您从TensorFlow的Java API收到错误消息:

Exception in thread "main" java.lang.IllegalArgumentException: You must feed a value for placeholder tensor 'batch_normalization_1/keras_learning_phase' with dtype bool [[Node: batch_normalization_1/keras_learning_phase = Placeholder[dtype=DT_BOOL, shape=<unknown>, _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

表明,该模型用在需要您为名为batch_normalization_1/keras_learning_phase张量养活一个布尔值的方式构成。

所以,你必须包括在您的来电run改变:

try (Session s = new Session(g); 
    Tensor result = s.runner().feed("input",image).fetch("output").run().get(0)) { 

喜欢的东西:

try (Session s = new Session(g); 
    Tensor learning_phase = Tensor.create(false); 
    Tensor result = s.runner().feed("input", image).feed("batch_normalization_1/keras_learning_phase", learning_phase).fetch("output").run().get(0)) { 

你喂节点的名称和取取决于模型,因此“输入”和“输出”节点的名称也可能不同。

您可能还需要考虑使用TensorFlow SavedModel format(也https://github.com/tensorflow/serving/issues/310#issuecomment-297015251见)

希望帮助

相关问题