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

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

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

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

深層学習

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

機械学習

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

Python

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

Q&A

解決済

2回答

2886閲覧

Kerasにおける画像の2クラス分類で学習が進まない、lossが減らない。

gammaman

総合スコア3

Keras

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

深層学習

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

機械学習

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

Python

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

0グッド

0クリップ

投稿2021/02/16 13:09

編集2021/02/16 13:13

カラー画像をkerasを使っての2クラス分類を試みています。
しかし、train_lossが減らず、train_accuracy,val_accuracy共に0.5前後をさまよってしまいます。

以下、使用したコードを載せます。

python

1import os 2import re 3 4import tensorflow.keras 5from tensorflow.keras import utils, datasets, optimizers 6from tensorflow.keras.layers import Input, Embedding, LSTM, Conv2D, MaxPooling2D, concatenate 7from tensorflow.keras.models import Sequential, Model 8from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten 9from tensorflow.keras.preprocessing.image import array_to_img, img_to_array, load_img 10from tensorflow.keras.applications.resnet50 import ResNet50 11import numpy as np 12 13 14np.set_printoptions(threshold=np.inf) 15 16def list_pictures(directory, ext='jpg|jpeg|bmp|png|ppm'): 17 return [os.path.join(root, f) 18 for root, _, files in os.walk(directory) for f in files 19 if re.match(r'([\w]+.(?:' + ext + '))', f.lower())] 20 21 22# フォルダの中にある画像を順次読み込む 23# カテゴリーは0から始める 24X = [] 25Y = [] 26 27i=0 28# 対象Aの画像 29for picture in list_pictures('./images/png/train/A/'): 30 img = img_to_array(load_img(picture, target_size=(64,64))) 31 X.append(img) 32 Y.append(0) 33 i=i+1 34 if i >= 20865: 35 break 36 37j=0 38# 対象Bの画像 39for picture in list_pictures('./images/png/train/B/'): 40 img = img_to_array(load_img(picture, target_size=(64,64))) 41 X.append(img) 42 Y.append(1) 43 j=j+1 44 if j >= 20865: 45 break 46 47# arrayに変換 48images = np.asarray(X) 49labels = np.asarray(Y) 50 51images = images.astype('float32') 52images /= 255.0 53 54#データのシャッフル 55p = np.random.permutation(len(images)) 56images = images[p] 57labels = labels[p] 58 59 60###モデルの定義### 61image_input = Input(shape=(64, 64, 3,), name='image_input') 62 63ResNet50 = ResNet50(include_top=False, weights=None, input_shape=(64, 64, 3))(image_input) 64x = Flatten()(ResNet50) 65image_out = Dense(1, activation='relu')(x) 66main_output = Dense(1, activation='sigmoid', name='main_output')(image_out) 67 68model = Model(inputs=[image_input], outputs=[main_output]) 69 70model.compile(optimizer=optimizers.SGD(lr=1e-2, momentum=0.9), 71 loss='binary_crossentropy', 72 metrics=['accuracy']) 73model.summary() 74 75model.fit( images, labels, epochs=100, batch_size=16, validation_split=0.1, shuffle=True)
Epoch 1/100 2021-02-16 21:54:43.420110: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10 2021-02-16 21:54:43.598753: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7 2348/2348 [==============================] - 57s 24ms/step - loss: 0.6935 - accuracy: 0.5003 - val_loss: 0.6931 - val_accuracy: 0.5006 Epoch 2/100 2348/2348 [==============================] - 56s 24ms/step - loss: 0.6936 - accuracy: 0.4968 - val_loss: 0.6939 - val_accuracy: 0.5006 Epoch 3/100 2348/2348 [==============================] - 56s 24ms/step - loss: 0.6937 - accuracy: 0.4971 - val_loss: 0.6934 - val_accuracy: 0.5006 Epoch 4/100 2348/2348 [==============================] - 56s 24ms/step - loss: 0.6936 - accuracy: 0.4979 - val_loss: 0.6937 - val_accuracy: 0.5006 Epoch 5/100 2348/2348 [==============================] - 56s 24ms/step - loss: 0.6935 - accuracy: 0.5046 - val_loss: 0.6934 - val_accuracy: 0.4994 Epoch 6/100 2348/2348 [==============================] - 56s 24ms/step - loss: 0.6935 - accuracy: 0.4979 - val_loss: 0.6942 - val_accuracy: 0.5006 Epoch 7/100 2348/2348 [==============================] - 56s 24ms/step - loss: 0.6937 - accuracy: 0.4988 - val_loss: 0.6932 - val_accuracy: 0.5006 Epoch 8/100 2348/2348 [==============================] - 56s 24ms/step - loss: 0.6934 - accuracy: 0.5037 - val_loss: 0.6933 - val_accuracy: 0.5006 Epoch 9/100 2348/2348 [==============================] - 56s 24ms/step - loss: 0.6935 - accuracy: 0.4993 - val_loss: 0.6942 - val_accuracy: 0.4994 Epoch 10/100 2348/2348 [==============================] - 56s 24ms/step - loss: 0.6936 - accuracy: 0.4982 - val_loss: 0.6933 - val_accuracy: 0.5006 Epoch 11/100 2348/2348 [==============================] - 55s 23ms/step - loss: 0.6936 - accuracy: 0.4990 - val_loss: 0.6936 - val_accuracy: 0.5006 Epoch 12/100 2348/2348 [==============================] - 55s 23ms/step - loss: 0.6937 - accuracy: 0.4970 - val_loss: 0.6932 - val_accuracy: 0.5006 Epoch 13/100 2348/2348 [==============================] - 56s 24ms/step - loss: 0.6936 - accuracy: 0.4988 - val_loss: 0.6932 - val_accuracy: 0.4994 Epoch 14/100 2348/2348 [==============================] - 55s 23ms/step - loss: 0.6935 - accuracy: 0.4989 - val_loss: 0.6932 - val_accuracy: 0.5006

試したこと

学習用データをシャッフルせずに学習したところ、正答率は0.9をこえました。
ということは学習用データをシャッフルする過程に問題があるのでしょうか?

Epoch 1/100 2021-02-16 21:45:31.089529: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10 2021-02-16 21:45:31.269549: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7 2348/2348 [==============================] - 61s 26ms/step - loss: 0.1165 - accuracy: 0.9726 - val_loss: 0.0100 - val_accuracy: 1.0000 Epoch 2/100 2348/2348 [==============================] - 60s 25ms/step - loss: 0.1806 - accuracy: 0.9472 - val_loss: 0.0100 - val_accuracy: 1.0000 Epoch 3/100 2348/2348 [==============================] - 60s 25ms/step - loss: 0.1806 - accuracy: 0.9472 - val_loss: 0.0100 - val_accuracy: 1.0000 Epoch 4/100 2348/2348 [==============================] - 60s 25ms/step - loss: 0.1806 - accuracy: 0.9472 - val_loss: 0.0100 - val_accuracy: 1.0000 Epoch 5/100 2348/2348 [==============================] - 59s 25ms/step - loss: 0.1806 - accuracy: 0.9472 - val_loss: 0.0100 - val_accuracy: 1.0000 Epoch 6/100 2348/2348 [==============================] - 60s 26ms/step - loss: 0.1806 - accuracy: 0.9472 - val_loss: 0.0100 - val_accuracy: 1.0000 Epoch 7/100 2348/2348 [==============================] - 60s 26ms/step - loss: 0.1806 - accuracy: 0.9472 - val_loss: 0.0100 - val_accuracy: 1.0000

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

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

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

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

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

meg_

2021/02/16 13:35

> 学習用データをシャッフルせずに学習したところ、正答率は0.9をこえました。 そのモデルでテストした場合の正答率はどうなりますか?
退会済みユーザー

退会済みユーザー

2021/02/16 13:50

> lr=1e-2 学習率が高いような気もします。 学習率が高いとLossが高いままふらふらする(最悪発散する)傾向があります。 lossを見るとそういうことが起きているような感じがするためです。 1.0e-3かe-4くらいで試していただけますか?
aipy2020

2021/02/16 14:23

>学習用データをシャッフルせずに学習したところ、正答率は0.9をこえました。 「シャッフル」は、 p = np.random.permutation(len(images)) images = images[p] labels = labels[p] のことでしょうか? それとも model.fitの"shuffle=True" のことでしょうか?
gammaman

2021/02/18 07:38 編集

皆様ありがとうございます。遅れてすみません。 meg_さん 申し訳ございません。テストの仕方が分かりませんので今すぐにはお答えできません。 勉強不足です。 fourteenlengthさん 学習率を小さくしてもLossが減らず正答率0.5前後をふらふらしています aipy2020さん 二つのシャッフルを無効にしました
退会済みユーザー

退会済みユーザー

2021/02/18 09:51

あとはあるとすれば読み込んだ画像がちゃんと読めていない系のポカの可能性がありそうです。OpenCVかmatplotlibで読み込んだ画像を1000枚に一枚くらい表示させて最大値最小値が狙い通りか確認してはいかがでしょうか?ビューワーで見るだけだと最大最小が確認できませんのでがぞうが0-1か0-255か、もっと別かチェックする意図で書いています。
gammaman

2021/02/18 10:26

一応、画像が0-1の値をとることは確認しました。 こちらで解決できました。自己解決欄に書いておきます。 みなさん、どうもありがとうございました!
guest

回答2

0

自己解決

最終層の1つ前の層

python

1image_out = Dense(1, activation='relu')(x)

を除きました。そして

python

1main_output = Dense(1, activation='sigmoid', name='main_output')(x)

のように最終層をFlatten層につながるように書き換えたところ、学習時にlossが減るようになりました。
理由はわかりません。

投稿2021/02/18 10:31

gammaman

総合スコア3

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

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

退会済みユーザー

退会済みユーザー

2021/02/20 01:55

>Flatten層につながるように書き換えたところ、学習時にlossが減るようになりました。 理由はわかりません。 完全に答えが出てからなので後出しじゃんけん以外の何物でもないですが、変更前だとreluを通すためにマイナスの情報が欠落していた(直感的な理解で情報の半分は欠落していた)、だから正解率も50%だった、ということかもしれませんね。 貴重な知見の共有をありがとうございました。 https://arakan-pgm-ai.hatenablog.com/entry/2018/11/07/090000 私も勉強になりました:)
guest

0

手元で似たようなソースコードを作成し、再現できたような気がしますので回答します。

シャッフルの有り無しでlossの値が異なることを質問に記載して頂いていますが、
問題の実態は乱数依存(ニューラルネットの重みの初期値)のように推測します。

何度も同じコードを実行したときに(シャッフルの有り無しそれぞれで)同じ結果になるでしょうか。
かなり絶妙なパラメータとなっていて、乱数で実行するたびに結果が大きく振れる状況なのではないかと。

解決法としては、最終層の1つ前の層

python

1image_out = Dense(1, activation='relu')(x)

のノード数を増やすと安定すると思います。
ノード数の具体的数値はデータセットに依存するので正解はないのですが、
例えば次のようにした場合にはどのような結果になりますでしょうか?

python

1image_out = Dense(100, activation='relu')(x)

投稿2021/02/16 15:09

aipy2020

総合スコア35

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

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

gammaman

2021/02/18 07:38

>何度も同じコードを実行したときに(シャッフルの有り無しそれぞれで)同じ結果になるでしょうか。 何度も実行しても同じ結果になります。シャッフル有り無しそれぞれ同様です。 最終層の一つ前の層をご指摘の通り image_out = Dense(100, activation='relu')(x) に変えても、結果は変わりませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問