web-dev-qa-db-ja.com

事前学習済み(Tensorflow)CNNを使用して特徴を抽出する

ディープラーニングは、少数のクラス(猫、犬、車、飛行機など)を分類するためのいくつかの大きなデータセットに適用され、SIFTやカラーヒストグラムなどの機能のバッグのような単純な記述子を破るパフォーマンスを備えています。

それにもかかわらず、このようなネットワークのトレーニングには、クラスごとの大量のデータと多くのトレーニング時間が必要です。ただし、多くの場合、十分なデータがないか、単にたたみ込みニューラルネットワークがどれだけうまくいくかを知りたい場合は、そのようなデバイスを設計およびトレーニングし、トレーニングデータを収集します。

この特定のケースでは、最先端の出版物で使用されているベンチマークデータセットを使用してネットワークを構成およびトレーニングし、特徴抽出機能として使用できるデータセットに単純に適用することが理想的です。

これにより、各画像に一連の特徴がもたらされ、SVM、ロジスティック回帰、ニューラルネットワークなどの古典的な分類方法に入力できます。

特に、CNNをトレーニングするのに十分なデータがない場合、これはCNNが少数のサンプルでトレーニングされたパイプラインよりも優れていると思われます。

私はテンソルフローのチュートリアルを見ていましたが、常に明確なトレーニング/テスト段階があるようです。事前に構成されたCNN機能抽出機能を備えたpickleファイル(または同様のファイル)が見つかりませんでした。

私の質問は次のとおりです。事前に訓練されたネットワークが存在するのか、どこで見つけられるのか。あるいは、このアプローチは理にかなっていますか? CNN + weightsはどこにありますか?

[〜#〜] edit [〜#〜] W.r.t. @johnのコメント'DecodeJpeg:0''DecodeJpeg/contents:0'を使用してみて、異なる出力をチェックしました(:S)

import cv2, requests, numpy
import tensorflow.python.platform
import tensorflow as tf


response = requests.get('https://i.stack.imgur.com/LIW6C.jpg?s=328&g=1')
data = numpy.asarray(bytearray(response.content), dtype=np.uint8)
image = cv2.imdecode(data,-1)

compression_worked, jpeg_data = cv2.imencode('.jpeg', image)
if not compression_worked:
    raise Exception("Failure when compressing image to jpeg format in opencv library")
jpeg_data = jpeg_data.tostring()

with open('./deep_learning_models/inception-v3/classify_image_graph_def.pb', 'rb') as graph_file:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(graph_file.read())
    tf.import_graph_def(graph_def, name='')

with tf.Session() as sess:
    softmax_tensor = sess.graph.get_tensor_by_name('pool_3:0')

    arr0 = numpy.squeeze(sess.run(
        softmax_tensor,
        {'DecodeJpeg:0': image}
    ))

    arr1 = numpy.squeeze(sess.run(
        softmax_tensor,
        {'DecodeJpeg/contents:0': jpeg_data}
    ))

    print(numpy.abs(arr0 - arr1).max())

したがって、最大絶対差は1.27649であり、一般にすべての要素が異なります(特にarr0およびarr1自体の平均値は0から0.5の間にあるため)。

また、'DecodeJpeg:0'にはnumpy配列ではなくjpeg-stringが必要であると予想します。他に名前に 'Jpeg'が含まれているのはなぜですか。 @john:あなたのコメントについてあなたがどれだけ自信があるかを述べていただけますか?

だから、訓練されたニューラルネットワークが決定論的であると期待しているので、何が何なのかわからないと思います(しかし、せいぜいカオス的です)。

23
Herbert

TensorFlowチームは最近、ImageNetデータセットでトレーニングされたディープCNNをリリースしました。 here からデータ(モデルグラフとトレーニング済みの重みを含む)を取得するスクリプトをダウンロードできます。関連する 画像認識チュートリアル には、モデルに関する詳細があります。

現在のモデルは、後続のトレーニングステップで使用するために特別にパッケージ化されているわけではありませんが、スクリプトを変更して、モデルの一部とトレーニング済みの重みをネットワークで再利用できます。

18
mrry