2017-11-20 25 views
0

バッチモードでC++で事前計算されたCNNを使用して複数のサンプルを分類したいとします。これまでのところ:私はPythonでKerasとCNNモデルを訓練し、が提供する小さなスクリプトを使用して、このモデルを変えたSession :: Run(TensorFlow C++ API)を使用してバッチモードでサンプルのCNNベースの分類を実行する方法

入力テンソルのnの分類を実行したいと思います。次のコードは動作しますが、(〜20msec)での実行がかなり高速ですが、約20,000回実行する必要があるため、かなり遅いです。

std::vector<tensorflow::Tensor> outputs; 
std::vector<tensorflow::Tensor> tensor(tensorflow::DT_FLOAT, 
    tensorflow::TensorShape({1, winSize, winSize, nochannels }));; 
for (unsigned int n = 0; n < noSamples; n++) 
{ 
    copyDataToTensor(prevImg, prevPoints[n], input_tensor, 0); 
    tensorflow::Status run_status = m_Session->Run({ { "conv2d_5_input", tensor} }, { "output_node0" }, {}, &outputs); 
    ... evaluate outputs ... 
} 

winSizenoChannelsは次にCNN入力形状に関連するいくつかの定数です。

は、私は何を探していますと、のようなバッチモードで複数のサンプルを実行するためのアプローチです:

std::vector<tensorflow::Tensor> outputs; 
std::vector<tensorflow::Tensor> tensor(tensorflow::DT_FLOAT, 
     tensorflow::TensorShape({noSamples, winSize, winSize, nochannels }));; 
for (unsigned int n = 0; n < noSamples; n++) 
{ 
    copyDataToTensor(prevImg, prevPoints[n], input_tensor, n); 
} 
tensorflow::Status run_status = m_Session->Run({ { "conv2d_5_input", tensor} }, { "output_node0" }, {}, &outputs); 
... evaluate outputs ... 

しかし、このアプローチはoutputsので、動作していない一つの要素だけであり、このテンソルのためのコンテンツが格納され唯一の分類結果の結果。

noSamples{"ouput_node0"}のベクターを提供することは、同様に機能しません。そしてoutputsテンソルベクトルは正しいサイズを持ちますが、各テンソルは似ています。

この機能を正しく使用して、バッチモードで予測を実行するにはどうすればよいですか?私はその問題のために使用しなければならない別のインターフェイスがありますか?

答えて

0

2番目のバッチモードの奇妙な動作の理由は、このrepo(https://github.com/amir-abdi/keras_to_tensorflow)からのKeras to Python tranforスクリプトのバグです。

dense_2/Softmaxノードではなく、間違った方法で出力を接続すると、間違った結果につながる小さなバグです。バグコードは次の通りであった:

K.set_learning_phase(0) net_model = load_model(weight_file_path)

pred = [None]*num_output 
pred_node_names = [None]*num_output 
for i in range(num_output): 
    pred_node_names[i] = prefix_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) 
sess = K.get_session() 
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_text=False) 

これは、[I] net_model.outputの小さなミスがあったことシーム。 outputフィールドが代わりに使用された場合(net_model.outputs [i])everythinkはうまく動作します。 I.修正は次のようになります。

K.set_learning_phase(0) 
net_model = load_model(weight_file_path) 

pred = [None]*num_output 
pred_node_names = [None]*num_output 
for i in range(num_output): 
    pred_node_names[i] = prefix_output_node_names_of_final_network+str(i) 
    pred[i] = tf.identity(net_model.outputs[i], name=pred_node_names[i]), 
print('output nodes names are: ', pred_node_names) 
sess = K.get_session() 
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_text=False) 
関連する問題