前提・実現したいこと
tensorflow(Python)を使って画像分類の機械学習を行っています。
正答率は98%ほどになったのですが、実際にモデルを使って推論を行おうとすると期待する分類とは異なるクラスばかりに推論されてしまいます。
訓練データに使用した画像を推論に用いても異なるクラスに分類されました。
原因がわからず手詰まり状態なのでお教えいただけると幸いです。
該当のソースコード
Python
1import tensorflow as tf 2import matplotlib.pyplot as plt 3import numpy as np 4import keras 5import os 6import tensorflow as tf 7import tensorflow_hub as hub 8import tensorflow_datasets as tfds 9tfds.disable_progress_bar() 10from tensorflow.keras.preprocessing.image import ImageDataGenerator 11import time 12 13 14base_dir="/content/drive/My Drive/sagyo/dataset/" 15train_dir = os.path.join(base_dir, 'train') 16validation_dir = os.path.join(base_dir, 'validation') 17BATCH_SIZE = 64 18IMG_SHAPE_w = 480 19IMG_SHAPE_h = 640 20def plotImages(images_arr): 21 fig, axes = plt.subplots(1, 5, figsize=(20,20)) 22 axes = axes.flatten() 23 for img, ax in zip(images_arr, axes): 24 ax.imshow(img) 25 plt.tight_layout() 26 plt.show() 27image_gen = ImageDataGenerator(rescale=1./255) 28 29train_data_gen = image_gen.flow_from_directory(batch_size=BATCH_SIZE, 30 directory=train_dir, 31 shuffle=True, 32 target_size=(IMG_SHAPE_w, IMG_SHAPE_h), 33 class_mode='sparse') 34augmented_images = [train_data_gen[0][0][0] for i in range(5)] 35plotImages(augmented_images) 36 37image_gen_val = ImageDataGenerator(rescale=1./255) 38 39val_data_gen = image_gen_val.flow_from_directory(batch_size=BATCH_SIZE, 40 directory=validation_dir, 41 target_size=(IMG_SHAPE_w, IMG_SHAPE_h), 42 class_mode='sparse') 43model = tf.keras.models.Sequential([ 44 tf.keras.layers.Conv2D(16,(3,3),activation="relu", input_shape=(480,640,3)), 45 tf.keras.layers.MaxPooling2D(2,2), 46 47 48 tf.keras.layers.Conv2D(32,(3,3),activation="relu"), 49 tf.keras.layers.MaxPooling2D(2,2), 50 51 52 tf.keras.layers.Conv2D(64,(3,3),activation="relu"), 53 tf.keras.layers.MaxPooling2D(2,2), 54 55 tf.keras.layers.Conv2D(128,(3,3),activation="relu"), 56 tf.keras.layers.MaxPooling2D(2,2), 57 58 tf.keras.layers.Conv2D(256,(3,3),activation="relu"), 59 tf.keras.layers.MaxPooling2D(2,2), 60 61 tf.keras.layers.Conv2D(512,(3,3),activation="relu"), 62 tf.keras.layers.MaxPooling2D(2,2), 63 64 65 tf.keras.layers.Dropout(0.2), 66 tf.keras.layers.Flatten(), 67 tf.keras.layers.Dense(512,activation="relu"), 68 tf.keras.layers.Dense(33) 69]) 70 71#コンパイル 72model.compile(optimizer="ADAM", 73 loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), 74 metrics=["accuracy"]) 75 76epochs = 10 77history = model.fit_generator( train_data_gen, 78 steps_per_epoch=int(np.ceil(1747 / float(BATCH_SIZE))), 79 epochs=epochs, 80 validation_data=val_data_gen, 81 validation_steps=int(np.ceil(609 / float(BATCH_SIZE))), 82 callbacks = [cp_callback] 83) 84model.save('/content/drive/My Drive/tensorflow/model.h5') 85
試したこと
学習で使った全ての画像で推論させました。
Python
1def check(l): 2 dir=os.listdir("/content/drive/My Drive/sagyo/dataset/train/"+l) 3 #print(dir) 4 n=0 5 num=[] 6 for i in enumerate(dir): 7 img2=cv2.imread("/content/drive/My Drive/sagyo/dataset/train/"+l+"/"+dir[n]) 8 n=n+1 9 img2=cv2.resize(img2,(480,640))/255.0 10 #これに1時間かかった。畜生 11 img2=img2.reshape(-1,480,640,3) 12 pr=model.predict(img2) 13 predicted_ids = np.argmax(pr, axis=-1) 14 ids=int(predicted_ids) 15 num.append(ids) 16 print(l+";"+str(num)) 17
変数の「l」が画像のラベル(1~33)になります。
出てくるラベルが限られていてしかも複数のクラスで同一の推論がされるため何かが間違っているのだと思います...
よろしくお願いします。
あなたの回答
tips
プレビュー