2017-07-11 8 views
0

私は、テンソルフローを使ってPythonで画像分類ネットワークを訓練しました。訓練されたモデルは.pbとして保存されました。さて、私はモデルをテストしたい、私はこれをC++で行う必要がある。C++で訓練されたテンソルフローモデルを実行する

私はnumpyをデータの操作と操作に使用しました。訓練フェーズの間、画像は数が少ない配列として渡されます。イメージは1D配列として引き伸ばされ、クラスラベルはこの配列の先頭に追加されます。

numpyが利用できないC++でモデルを実行しているときに画像データを渡す方法については混乱します。私はデータを操作して処理するために操作numpyを使用します。 C++で実行する必要がある場合は、どのフォーマットでデータを渡す必要がありますか?以下は

は私が訓練し

def trainModel(data): 
    global_step = tf.Variable(0, name='global_step', trainable=False) 
    X, y,keep_prob = modelInputs((741, 620, 1),4) 
    logits = cnnModel(X,keep_prob) 
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y), name="cost") 
    optimizer = tf.train.AdamOptimizer(.0001, name='Adam').minimize(cost) 
    prediction = tf.argmax(logits, 1, name="prediction") 
    correct_pred = tf.equal(prediction, tf.argmax(y, 1), name="correct_pred") 
    accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32), name='accuracy') 
    with tf.Session() as sess: 
     sess.run(tf.global_variables_initializer()) 
     saver = tf.train.Saver() 
     batch_size = 30 
     for e in range(11): 
      batch_x, batch_y = data.next_batch(batch_size) 
      batch_y = batch_y.astype('int32') 
      x = np.reshape(batch_x, [batch_size, 741, 620, 1]) 
      labels = np.zeros(shape=(batch_size,4)) 
      labels[np.arange(len(labels)),batch_y]=1 
      sess.run(optimizer, feed_dict={X: x, y: labels,keep_prob:0.5}) 
      global_step.assign(e).eval() 
     saver.save(sess, './my_test_model',global_step=global_step) 

* 741x620はC++でグラフを使用するための

+0

Tensorflowは確かにあなたも、あなたが持っているかわからないので、複雑なネットワークを構築することが容易になります。 C++からNNをどのくらい正確に実行する予定ですか?取り扱っているネットワークやライブラリ?注:図書館の推奨事項はここで話題にはなりません – MSalters

+0

@MSalters私は[this](https://gist.github.com/jimfleming/4202e529042c401b17b7#file-loader-cc)のようにするつもりです。 ソリューションにライブラリの推奨事項が含まれているかどうかはわかりません。 C++でモデルを呼びたいのですが、numpyにアクセスできないときにデータを渡す方法がわかりません。 – dpk

+0

これは関連性があります。テンソルフローを引き続き使用する予定です。これは、入力をテンソルフローにどのように挿入するかという疑問だけを残す。 @正確なのは – MSalters

答えて

3

指示がhereを見つけることができる画像のサイズである私のモデルを保存する方法です。ここで

は、入力として、あなたのイメージを使用するには、いくつかのコードは次のとおりです。

tensorflow::Tensor keep_prob = tensorflow::Tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape()); 
keep_prob.scalar<float>()() = 1.0; 

tensorflow::Tensor input_tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({1,height,width,depth})); 
auto input_tensor_mapped = input_tensor.tensor<float, 4>(); 
const float * source_data = (float*) img.data; // here img is an opencv image, but if it's just a float array this code is very easy to adapt 
// copying the image data into the corresponding tensor 
for (int y = 0; y < height; ++y) { 
    const float* source_row = source_data + (y * width * depth); 
    for (int x = 0; x < width; ++x) { 
     const float* source_pixel = source_row + (x * depth); 
     for (int c = 0; c < depth; ++c) { 
      const float* source_value = source_pixel + c; 
      input_tensor_mapped(0, y, x, c) = *source_value; 
     } 
    } 
} 
std::vector<tensorflow::Tensor> finalOutput; 

tensorflow::Status run_status = this->tf_session->Run({{InputName,input_tensor}, 
                 {dropoutPlaceHolderName, keep_prob}}, 
                 {OutputName}, 
                 {}, 
                 &finalOutput); 
+0

logitsノードを評価しているときに 'finalOutput'の内容を出力するにはどうすればいいですか?(テンソルには4つの項目があり、4つのクラスがあります)私は 'auto output_c = finalOutput [0] .scalar ()を使用します。 std :: cout << output_c()<< "\ n"; 'これは予測ノードの出力を出力します。出力はただ一つの数値です。 – dpk

+1

私はこのコードをオンラインで見つけました、xhanも扁平化する必要があるのか​​、それは私にとってはうまくいかないのですか: 'tensorflow :: TTypes :: Flat indices_flat = finalOutput [1] .flat ();for(int i = 0; i gdelab

関連する問題