LoginSignup
0
2

More than 3 years have passed since last update.

Keras について調査中

Last updated at Posted at 2020-02-09

Keras について調査中

(たぶん、いろいろ間違えている。)

Keras関連で利用しているtensorflowはtensoflow1.xのこともあるし、tensoflow2.xのことがある。
tensorflow2.xではtensorflow1.x で動作しないことがある。

Kerasで処理する場合でも、kerasでbackend でtensorflowを使うことによってtensorflowのバージョンの影響を受けるようだ。

そのため、別のバージョンのtensorflow を必要とするときはpython3 -m venv .venvなどとして仮想環境を作り、その中にpip install で目的のバージョンのtensorflow を利用して、作業すること。

tensorflowのバージョンの記述のないある程度古い記事の場合には、tensorflow1.x を使っていることが多い。

tensorflowの場合、

  • frozen になっていないモデル:
  • frozen になっていないモデル

との両方があって、他のフレームワークで使うための入力としては、frozenになっているのを使う。

わかっていないこと。
なぜ .pbファイルだけでは不十分なのか?
それでいて
.pbファイルを読んだあとに、pbtxtファイルを生成しているのがあるのか?

第1段階:Kerasで学習、Kerasで推論

TensorFlow > 学ぶ > TensorFlow Core > チュートリアル > Image classification

kerasのモデルのcompileとは

コンパイル

モデルの学習を始める前に,compileメソッドを用いどのような学習処理を行なうかを設定する必要があります.compileメソッドは3つの引数を取ります:

最適化アルゴリズム: 引数として,定義されている最適化手法の識別子を文字列として与える(rmspropやadagradなど),もしくは Optimizerクラスのインスタンスを与えることができます. 参考: 最適化
損失関数: モデルが最小化しようとする目的関数です.引数として,定義されている損失関数の識別子を文字列として与える(categorical_crossentropyやmseなど),もしくは目的関数を関数として与えることができます.参考:損失関数
評価関数のリスト: 分類問題では精度としてmetrics=['accuracy']を指定したくなるでしょう.引数として,定義されている評価関数の識別子を文字列として与える,もしくは自分で定義した関数を関数として与えることができます.

上記の github 上の ipynb ファイル classification.ipynb

github Keras Multi label Image Classification

Keras modelを保存するには?
モデル全体の保存/読み込み(アーキテクチャ + 重み + オプティマイザの状態)

model.save('my_model.h5')

from keras.models import load_model
model = load_model('my_model.h5')

Kerasで学習のモデルを作る際のネットワークは、drop_outのように推論時には使われない構造が入っている。そのため、Kerasで学習に用いたネットワーク構造では、そのままで、推論を効率的に行うネットワークを与えることが簡単ではない。
(どうやら、それが、Kerasのモデルを直接、他のモデルに変換するのが簡単ではないことにつながっているのだろうか。)

HDF5 ファイル

Keras - Keras のファイルの形式について

model.to_json()
[TF]KerasでModelとParameterをLoad/Saveする方法

to_json()で出力されるファイルは、下にあるkeras to tensorflow のスクリプトの中で使われている。

model.save_weights(filepath): モデルの重みをHDF5形式のファイルに保存します.
https://keras.io/ja/models/about-keras-models/

第2段階:Kerasで学習、Tensorflowで推論

kerasのモデルをデプロイする手順

KerasのTensorflow Backendで作ったCNNをTensorflow Graphにして使う

github Keras to TensorFlow

python keras_to_tensorflow.py 
    --input_model="path/to/keras/model.h5" 
    --input_model_json="path/to/keras/model.json" 
    --output_model="path/to/save/model.pb"

--save_graph_def を有効にするとpbtxt ファイルを出力する

第3段階:Kerasで学習、OpenCVで推論

OpenCVで推論するときには
*.pb, *.pbtxt の2つのファイルを必要とする。
*.pbファイルは、Protocol Buffers形式のデータ構造のデータファイルです。

TensorFlow内部構造解析 (1.1) Protocol Buffers形式のデータ構造

第4段階:Kerasで学習、OpenVinoで推論

Keras to OpenVINO format conversion

その他:keras からOnnxへの変換

keras2onnx


Tensorflow の場合

Tensorflow で学習、Tensorflow で推論

Tensorflow で学習、Tensorflowのfronzenモデルで推論

TensorFlow Object Detection API

Tensorflow で学習、OpenCVで推論

この場合には、推論実行時には tensorflow のインストールは不要になる。

Try to run the model using OpenCV:

readNetFromTensorflow()

retval = cv.dnn.readNetFromTensorflow( model[, config]) 

model path to the .pb file with binary protobuf description of the network architecture
config path to the .pbtxt file that contains text graph definition in protobuf format. Resulting Net object is built by text graph using weights from a binary one that let us make it more flexible.

*.pb , *.pbtxt の2種類の学習済ファイルが必要になる。

Tensorflow で推論、OpenVinoで推論

Converting a TensorFlow* Model


pbtxt file
http://docs.fabo.io/tensorflow/building_graph/tensorflow_protocol_buffers_part2.html

Deep Learningアプリケーション開発 (2) TensorFlow with Python
https://qiita.com/iwatake2222/items/80fc73ff23d8f51650f5

また、get_model_info 関数を呼ぶことで、変換したTensorFlow用モデルの情報をJSONファイルに保存します。

stack overflow How to transform keras model to tensorflow .pb and .pbtxt without issues?

https://answers.opencv.org/question/206493/keras-to-tensorflow-to-opencv-dnn/
pbファイルからpbtxtを生成する例。生成後にpb,pbtxt ファイルの両方を用いて
cvNet = cv.dnn.readNetFromTensorflow('lenet.pb', 'lenet2.pbtxt')
でモデルを読み込んでいる。

your .pbtxt file isn't useful "as is", you have to edit it a bit:
then, you have to manually replace all flatten nodes with a single Flatten one,and rewire the inputs. the end of your .pbtxt should look like this:



    build and train your model in Keras
    Use K.get_session() to get TF session and output the model as .pb file
    Load .pb file using tf.GraphDef()
    Get the interface to tensors in the graph using their names
    Predict the results as usual tensorflow problem


0
2
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2