pythonを用いて、機械学習による画像認識を試しています。初心者です。
公式サイト「はじめてのニューラルネットワーク:分類問題の初歩」のモデルを参照し、自作画像で実行してみました。
学習後、学習に使用していない10画像を取込み、予測させたところ、正解率0%でした。
正解率0%の原因は、適切なモデルではない/適切に学習できていない/適切に予測できていない(適切に前処理ができていない?)など色々と考えられますが、原因がわかりません。
どなたかアドバイスをお願いしてもよろしいでしょうか。
■画像データの例
28×28ピクセル、0~9が描かれた各20画像:合計200画像
■プログラム(前処理)
v_image = [] v_label = [] for index, name in enumerate(folder): dir = TRAIN_PATH + "\" + name files = glob.glob(dir + "\*.png") print(dir) for i, file in enumerate(files): if COLOR_CHANNEL == 1: img = load_img(file, color_mode = "grayscale", target_size=(INPUT_IMAGE_SIZE, INPUT_IMAGE_SIZE)) elif COLOR_CHANNEL == 3: img = load_img(file, color_mode = "rgb", target_size=(INPUT_IMAGE_SIZE, INPUT_IMAGE_SIZE)) array = img_to_array(img) v_image.append(array) v_label.append(index) v_image = np.array(v_image) v_label = np.array(v_label) v_image = v_image.astype('float32') v_image = v_image / 255.0 v_label = np_utils.to_categorical(v_label, CLASS_NUM) train_images, test_images, train_labels, test_labels = train_test_split(v_image, v_label, test_size=0.20) train_images2 = np.squeeze(train_images) test_images2 = np.squeeze(test_images) print(train_images2.shape) print(test_images2.shape) #(160, 28, 28) #(40, 28, 28)
■プログラム(モデル)
model = keras.Sequential([ keras.layers.Flatten(input_shape=(28, 28)), keras.layers.Dense(128, activation='relu'), keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(train_images2, train_labels2, epochs=10) #Epoch 1/10 #160/160 [====] - 0s 241us/step - loss: 0.5764 - accuracy: 0.9375 #Epoch 2/10 #160/160 [====] - 0s 94us/step - loss: 0.4676 - accuracy: 0.9250 #Epoch 3/10 #160/160 [====] - 0s 98us/step - loss: 0.3689 - accuracy: 0.9500 #…略 #Epoch 10/10 #160/160 [====] - 0s 108us/step - loss: 0.1200 - accuracy: 1.0000
■プログラム(テストデータの予測):正解率100%
テストデータ:学習に使用した画像と同様に処理した画像データ:40画像
200画像をtrain data(160), test data(40)に分けている
predictions = model.predict(test_images2) for i in range(10): predict=predictions[i] true=test_labels2[i] pred=np.argmax(predict) if true == pred: answer = '〇' else: answer = '×' print("結果",answer,"正解",truename[true],"予測",predname[np.argmax(predict)],"予測確率",100*np.max(predict)) #結果 〇 正解 true1 予測 pred1 予測確率 69.27081942558289 #結果 〇 正解 true6 予測 pred6 予測確率 93.02898645401001 #結果 〇 正解 true1 予測 pred1 予測確率 98.59963059425354 #結果 〇 正解 true1 予測 pred1 予測確率 79.41316366195679 #結果 〇 正解 true5 予測 pred5 予測確率 86.45367622375488 #結果 〇 正解 true7 予測 pred7 予測確率 84.96416211128235 #結果 〇 正解 true0 予測 pred0 予測確率 97.37188220024109 #結果 〇 正解 true7 予測 pred7 予測確率 92.23640561103821 #結果 〇 正解 true8 予測 pred8 予測確率 54.4350802898407 #結果 〇 正解 true2 予測 pred2 予測確率 36.53178811073303
■プログラム(自作画像の予測):正解率0%
自作画像:学習に使用した画像と同様の処理をした(つもり)画像データ:10画像
for i in range(10): img=Image.open(filenames[i]).convert('RGB') img=ImageOps.grayscale(img) img=ImageOps.invert(img) img=img.resize((28,28)) im_np=np.asarray(img) im_np=im_np/255.0 x=im_np.reshape([1,28,28]) predict=model.predict(x) true=int(labels[i]) pred=np.argmax(predict) if true == pred: answer = '〇' else: answer = '×' print("結果",answer,"正解",truename[true],"予測",predname[np.argmax(predict)],"予測確率",100*np.max(predict)) #結果 × 正解 true0 予測 pred1 予測確率 84.3161940574646 #結果 × 正解 true1 予測 pred9 予測確率 28.724533319473267 #結果 × 正解 true2 予測 pred9 予測確率 38.480645418167114 #結果 × 正解 true3 予測 pred1 予測確率 47.03499674797058 #結果 × 正解 true4 予測 pred3 予測確率 50.42678117752075 #結果 × 正解 true5 予測 pred0 予測確率 24.910038709640503 #結果 × 正解 true6 予測 pred1 予測確率 33.938488364219666 #結果 × 正解 true7 予測 pred8 予測確率 27.09353268146515 #結果 × 正解 true8 予測 pred4 予測確率 41.56872630119324 #結果 × 正解 true9 予測 pred0 予測確率 35.21081507205963
回答2件
あなたの回答
tips
プレビュー