質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1207閲覧

転移学習がの精度が特徴ベクトルモデルに及ばない

ThoughtKnotSeer

総合スコア14

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/06 02:46

編集2020/10/09 08:06

2000点程度の画像データを使ってランク付けのモデルを作ろうとしています。
画像データは1~5段階で評価されており、順序尺度です。
https://stackoverflow.com/questions/38375401/neural-network-ordinal-classification-for-age
https://www.kaggle.com/c/diabetic-retinopathy-detection/discussion/13115
を参考に、スコアをそれぞれ{1: [0,0,0,0], 2: [1,0,0,0], 3: [1,1,0,0], 4: [1,1,1,0], 5: [1,1,1,1]}
としてエンコーディングしました。
画像は(224, 224)にリサイズしました。preprocess_inputを行うと特徴が消えたので採用しませんでした。

転移学習を行うためKerasの持つ学習済みモデルでをいくつか検証し、Resnetを用いると良さそうだったので以下の様に画像を学習済みモデルで特徴量変換してモデルを作成しました。
マルチラベル分類を参考にsigmoidで出力、binary_crossentropy損失を使っています。

python

1model = resnet.ResNet152(weights='imagenet', include_top=False, pooling="avg") 2data_feature = model.predict(image_data) 3# 2xxx/2xxx [==============================] - 88s XXms/sample 4 5train_x, test_x, train_y, test_y = train_test_split(data_feature, encorded_score) 6 7model=Sequential() 8model.add(Input(2048)) 9model.add(Dense(256, activation="relu")) 10model.add(Dropout(0.5)) 11model.add(Dense(4, activation="sigmoid")) 12model.compile(optimizer="adam", 13 loss="binary_crossentropy", 14 metrics=[total_acc]) 15 16history = model.fit(train_x, train_y, epochs=100, batch_size=16,validation_split=0.1) 17# Epoch 1/100 18# 1800/1800 [==============================] - 0s 273us/sample - loss: 0.1397 - total_acc: 0.7600 - val_loss: 0.2168 - val_total_acc: 0.6567 19# 中略、バリデーションの精度は変わらない 20# Epoch 100/100 21# 1800/1800 [==============================] - 0s 238us/sample - loss: 0.0646 - total_acc: 0.9039 - val_loss: 0.2837 - val_total_acc: 0.6667

この特徴抽出モデルと全結合のモデルをつなげると同じ精度がでず、不思議に思っています。
畳み込み層を凍結させて同じ形の全結合層とつなぎました。

python

1conv_model = resnet.ResNet152(weights='imagenet', include_top=False, pooling="avg",input_shape=(224,224,3)) 2conv_model.trainable = False 3 4top_model = Sequential() 5top_model.add(Input(2048)) 6top_model.add(Dense(256, activation="relu")) 7top_model.add(Dropout(0.5)) 8top_model.add(Dense(4, activation="sigmoid")) 9 10model = Sequential([conv_model,top_model]) 11 12model.compile(optimizer="adam", 13 loss="binary_crossentropy", 14 metrics=[total_acc]) 15 16train_x, test_x, train_y, test_y = train_test_split(image_data, encorded_score) 17history = model.fit(train_x, train_y, epochs=20, batch_size=16,validation_split=0.1) 18 19# Epoch 1/20 20# 2160/2160 [==============================] - 99s 46ms/sample - loss: 0.4650 - total_acc: 0.3463 - val_loss: 0.4620 - val_total_acc: 0.2780 21# 中略、バリデーションの精度は変わらない 22# Epoch 20/20 23# 2160/2160 [==============================] - 98s 46ms/sample - loss: 0.2599 - total_acc: 0.5963 - val_loss: 0.5168 - val_total_acc: 0.3320

私の理解ではこの2つはやっていることはほぼ同じという理解なのですが、学習を行う上でどのような違いがあるのでしょうか?
バリデーションの精度が上がらないのはなぜでしょうか?コードの間違いでしょうか?転移学習に対する理解が違うのでしょうか?
2番目のモデルで上手くいけば画像の水増しやファインチューニングを試そうと思っています。
この2つのモデルの違い、精度を上げる方法、コードの不適切な点等、ご教授いただきたいです。

tensorflow version2.1.0のtf.kerasを使っています。
宜しくお願いします。

追記

仕方ないので特徴ベクトルで学習させた全結合層と畳み込み層(imagenet学習済みResnet)を結合させてFine tuningを行ってみましたが、
不思議な結果になりました。

python

1model.evaluate(test_image, test_encord) 2# [0.2531382454914993, 0.6142322] 3model.fit(train_image, train_encord, epochs=3, batch_size=16,validation_split=0.1) 4# 2160/2160 [==============================] - 93s 43ms/sample - loss: 1.5922 - total_acc: 0.2333 - val_loss: 0.2954 - val_total_acc: 0.5643 5model.evaluate(test_image, test_encord) 6# [0.2892280397343725, 0.54681647] 7model.evaluate(train_image, train_encord) 8# [0.2311001866869706, 0.6222407]

悪い方向に学習するだけでなく、進捗で表示される結果とevaluateの結果が異なる等、何が起きているのか良く分かりません。
バグのような気もしてきたので環境を変えてみようかと思いますが、質問は数日で打ち切らせていただき、Tensorflowのコミュニティで聞いてみることにします。ありがとうございました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2020/10/06 03:36 編集

ImageNet の転移学習モデルを使うなら、ImageNet の平均と標準偏差を使って標準化する処理を行う必要があり、それが preprocess_input() 内で行われていると思うので、preprocess_input() を使うことは必須だと思いますがいかがでしょうか?
ThoughtKnotSeer

2020/10/06 05:13 編集

ご指摘ありがとうございます。何日かハマっているのでアドバイスにとても感謝しています。 この2つのモデルの違いは画像の前処理の違いでは、ということですね。 さらに伺いたいのですが、 1.元の画像がImageNetと似ていないグレースケールで、それを3チャンネルに拡張したためか、preeprocess_inputで本当に画像の特徴が消失してみえます。(値がほとんど0になる、真っ白の画像になる) 標準化処理なので目で見た特徴が失われても構わないのかなとも思うのですが、例えばPCAで見てもあまり良くなっているようには感じませんでした。本文追記に示します。 従って新しい質問として、 他の学習済みモデルを使うべきでしょうか? あるいは画像に何か前処理をするべきでしょうか? または転移学習モデルの画像前処理部分に手を入れることはできるでしょうか? 2.やや本筋と外れるのですが、この関数は破壊的な(引数を変更するin-placeな)関数なのでしょうか?メソッドでない関数でこうした副作用があるものは珍しいと感じました。(一度ハマりました) https://www.tensorflow.org/api_docs/python/tf/keras/applications/imagenet_utils/preprocess_input?hl=ja を読むと x2 = tf.keras.applications.mobilenet.preprocess_input(x1) のように使っていますが、実行するとx1も変更されているように見えます。
tiitoi

2020/10/06 05:29 編集

> preeprocess_inputで本当に画像の特徴が消失してみえます 標準化後の画像を目視で確認して特徴が消えているかどうか判断するのは適切ではないのではないでしょうか。[0, 1] に正規化した上で標準化すれば0に近い値になるのは別に不自然ではないです。あと何万次元の特徴量を持つ画像をPCAで2次元に落として分布を確認するのも適切ではないです。その時点で元の特徴がほとんど消えてしまっています。 とりあえず、resnet.preprocess_input() ありで学習してみて精度が出なかったらそのときまた原因を考えればよくないですか。
ThoughtKnotSeer

2020/10/06 06:32

ありがとうございます。個人的に入力データを可視化して検証するのも大事かなとは思いますが、目視確認やPCAが適切でないのは全く持って仰る通りです。 とりあえず試してみております、よくなりましたが、全結合モデルと同じ精度までは至らなさそう…?と感じています。クラウドにデータを移してもう少し学習させてみます。とりあえずローカルで20エポック回した結果を追記しておきます。 未だ質問受付中とさせてください。コメントがあればよろしくお願いします。
ThoughtKnotSeer

2020/10/06 06:33

>ソースを見ると、inplace で変更していますね ソースのご提示ありがとうございました!確かにそうなってますね。参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問