カラー画像をkerasを使っての2クラス分類を試みています。
しかし、train_lossが減らず、train_accuracy,val_accuracy共に0.5前後をさまよってしまいます。
以下、使用したコードを載せます。
python
import os import re import tensorflow.keras from tensorflow.keras import utils, datasets, optimizers from tensorflow.keras.layers import Input, Embedding, LSTM, Conv2D, MaxPooling2D, concatenate from tensorflow.keras.models import Sequential, Model from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten from tensorflow.keras.preprocessing.image import array_to_img, img_to_array, load_img from tensorflow.keras.applications.resnet50 import ResNet50 import numpy as np np.set_printoptions(threshold=np.inf) def list_pictures(directory, ext='jpg|jpeg|bmp|png|ppm'): return [os.path.join(root, f) for root, _, files in os.walk(directory) for f in files if re.match(r'([\w]+.(?:' + ext + '))', f.lower())] # フォルダの中にある画像を順次読み込む # カテゴリーは0から始める X = [] Y = [] i=0 # 対象Aの画像 for picture in list_pictures('./images/png/train/A/'): img = img_to_array(load_img(picture, target_size=(64,64))) X.append(img) Y.append(0) i=i+1 if i >= 20865: break j=0 # 対象Bの画像 for picture in list_pictures('./images/png/train/B/'): img = img_to_array(load_img(picture, target_size=(64,64))) X.append(img) Y.append(1) j=j+1 if j >= 20865: break # arrayに変換 images = np.asarray(X) labels = np.asarray(Y) images = images.astype('float32') images /= 255.0 #データのシャッフル p = np.random.permutation(len(images)) images = images[p] labels = labels[p] ###モデルの定義### image_input = Input(shape=(64, 64, 3,), name='image_input') ResNet50 = ResNet50(include_top=False, weights=None, input_shape=(64, 64, 3))(image_input) x = Flatten()(ResNet50) image_out = Dense(1, activation='relu')(x) main_output = Dense(1, activation='sigmoid', name='main_output')(image_out) model = Model(inputs=[image_input], outputs=[main_output]) model.compile(optimizer=optimizers.SGD(lr=1e-2, momentum=0.9), loss='binary_crossentropy', metrics=['accuracy']) model.summary() model.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
まだ回答がついていません
会員登録して回答してみよう