tensorflowのチュートリアルで犬と猫を学習させるプログラムがあったので、それを書き換えて自分と妹を学習させようと思ったのですが、学習するたびにlossの値がマイナスになります。以下が実行したプログラムと結果とtensorflowのチュートリアルのURLです。
ほぼチュートリアル、マルパクリでファイルの場所だけ変更しました。
犬、猫で実行した場合lossがマイナスになることはないのですが、自分と妹の顔切り取り写真ではlossがマイナスになります。
顔切り取りした画像を明度を変更したり傾けたりして水増しし、5000枚くらいまでふやしました。また、画像の大きさは統一にしなければならないと思っていたので、顔の画像を200×200に統一しました。
まだ、tensorflowを触り始めたばかりということもあり、何をどういう動作をしているのか、どう調べればよいのかよくわかっていません。
投げやりの質問になったしまったのですが、本当にどうすればよいのかわからないため、ご教授お願い致します。
行ったこと
画像のサイズが200×200にしたため、おかしいデータになったのかのとおもい、IMG_HEIGHT = 200,IMG_WIDTH = 200に変更しました。
が、結果は変わりませんでした。
そもそも、IMG_HEIGHTが何を示しているのかも調べてみましたがよくわかりませんでした。
python
1import tensorflow as tf 2from tensorflow.keras.models import Sequential 3from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D 4from tensorflow.keras.preprocessing.image import ImageDataGenerator 5 6import os 7import numpy as np 8import matplotlib.pyplot as plt 9 10PATH = 'C:/GraduationResearch/annotation/data' 11 12train_dir = os.path.join(PATH, 'train') 13validation_dir = os.path.join(PATH, 'validation') 14 15train_me_dir = os.path.join(train_dir, 'me') 16train_sister2_dir = os.path.join(train_dir, 'sister2') 17validation_me_dir = os.path.join(validation_dir, 'me') 18validation_sister2_dir = os.path.join(validation_dir, 'sister2') 19 20num_me_tr = len(os.listdir(train_me_dir)) 21num_sister2_tr = len(os.listdir(train_sister2_dir)) 22 23num_me_val = len(os.listdir(validation_me_dir)) 24num_sister2_val = len(os.listdir(validation_sister2_dir)) 25# num_father_val = len(os.listdir(validation_father_dir)) 26 27total_train = num_me_tr + num_sister2_tr 28total_val = num_me_val + num_sister2_val 29 30print(total_train) 31print(total_val) 32 33batch_size = 128 34epochs = 1 35IMG_HEIGHT = 150 36IMG_WIDTH = 150 37 38train_image_generator = ImageDataGenerator(rescale=1./255) 39validation_image_generator = ImageDataGenerator(rescale=1./255) 40print(train_image_generator) 41print(validation_image_generator) 42print("-------------------------------") 43 44 45train_data_gen = train_image_generator.flow_from_directory(batch_size=batch_size, 46 directory=train_dir, 47 shuffle=True, 48 target_size=(IMG_HEIGHT, IMG_WIDTH), 49 class_mode='binary') 50 51val_data_gen = validation_image_generator.flow_from_directory(batch_size=batch_size, 52 directory=validation_dir, 53 target_size=(IMG_HEIGHT, IMG_WIDTH), 54 class_mode='binary') 55 56sample_training_images, _ = next(train_data_gen) 57 58def plotImages(images_arr): 59 fig, axes = plt.subplots(1, 5, figsize=(20,20)) 60 axes = axes.flatten() 61 for img, ax in zip( images_arr, axes): 62 ax.imshow(img) 63 ax.axis('off') 64 plt.tight_layout() 65 plt.show() 66 67model = Sequential([ 68 Conv2D(16, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH ,3)), 69 MaxPooling2D(), 70 Conv2D(32, 3, padding='same', activation='relu'), 71 MaxPooling2D(), 72 Conv2D(64, 3, padding='same', activation='relu'), 73 MaxPooling2D(), 74 Flatten(), 75 Dense(512, activation='relu'), 76 Dense(1, activation='sigmoid') 77]) 78 79model.compile(optimizer='adam', 80 loss='binary_crossentropy', 81 metrics=['accuracy']) 82 83history = model.fit_generator( 84 train_data_gen, 85 steps_per_epoch=total_train // batch_size, 86 epochs=epochs, 87 validation_data=val_data_gen, 88 validation_steps=total_val // batch_size 89) 90 91acc = history.history['accuracy'] 92val_acc = history.history['val_accuracy'] 93 94loss = history.history['loss'] 95val_loss = history.history['val_loss'] 96 97epochs_range = range(epochs) 98 99plt.figure(figsize=(8, 8)) 100plt.subplot(1, 2, 1) 101plt.plot(epochs_range, acc, label='Training Accuracy') 102plt.plot(epochs_range, val_acc, label='Validation Accuracy') 103plt.legend(loc='lower right') 104plt.title('Training and Validation Accuracy') 105 106plt.subplot(1, 2, 2) 107plt.plot(epochs_range, loss, label='Training Loss') 108plt.plot(epochs_range, val_loss, label='Validation Loss') 109plt.legend(loc='upper right') 110plt.title('Training and Validation Loss') 111plt.show() 112 113model.save('catdig.h5')
解決法
dataファイルの中にme,sister2,fatherの3つが存在したため、labelが0,1,2と増えた。その結果、lossがマイナスになった。
me,sister2で学習させた場合0<loss<1の間に収まった。
多分学習できていると思う。
回答1件
あなたの回答
tips
プレビュー