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

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

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

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

Python

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

Q&A

0回答

991閲覧

[tensorflow]正答率は高く出ているのに実際の推論が上手くいかない

takak

総合スコア0

機械学習

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

Python

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

0グッド

0クリップ

投稿2020/11/08 00:11

前提・実現したいこと

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)になります。

結果は一部ですが、写真のようになりました。
イメージ説明

出てくるラベルが限られていてしかも複数のクラスで同一の推論がされるため何かが間違っているのだと思います...

よろしくお願いします。

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

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

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

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

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

toast-uz

2020/11/08 01:10

再現して確かめられないので、ここでコメントします。 モデルの最後に、activation='softmax' を入れてないのは、何故でしょうか?
meg_

2020/11/08 04:04

> 正答率は98%ほどになったのですが、 どのデータに対するaccuracyでしょうか?(訓練データ?バリデーションデータ?テストデータ?)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問