Keras test ve train dataseti ayrı ayrı oluşturma


#1

Merhaba,
Github sayfasındaki kodla daha önce datasetimi hazırlamıştım. Fakat bu sefer random değilde elle ayırdığım test ve train fotoğraflarını dataset haline getirmek istiyorum. Kodu aşağıdaki gibi düzenledim. Çıktıları doğru gibi dursa da, eğitime soktuğumda train değerleri daha öncekilerle aynı iken val_loss ve val_acc değerleri çok saçma çıkıyor. Yaptığım işlemde bir yanlışlık mı var acaba? Ya da bu şekilde bir dataseti oluşturmak için başka bir yöntem var mıdır? Teşekkürler

import os
import numpy as np
from os import listdir
from scipy.misc import imread, imresize
from keras.utils import to_categorical
from sklearn.model_selection import train_test_split

resim_boyutu = 100
kanal_sayisi = 1 # 1: Grayscale, 3: RGB
etiket_sayisi = 36 # sınıf sayısı
test_verisi_orani = 0.2 # %10 test
train_klasoru = 'drive/proje/train'
test_klasoru = 'drive/proje/test'
veriseti_klasoru = 'drive/proje/datasetleri/100x100_gri'

def resmi_al(resimler_klasoru):
    resim = imread(resimler_klasoru, flatten= True if kanal_sayisi == 1 else False)
    resim = imresize(resim, (resim_boyutu, resim_boyutu, kanal_sayisi))
    return resim

#Train verisetinin hazırlanması
etiketler_train = listdir(train_klasoru)
x_train, y_train = [], []

for i, etiket in enumerate(etiketler_train):
    etiket_klasoru = train_klasoru+'/'+etiket

    for resim_adi in listdir(etiket_klasoru):
        resim = resmi_al(etiket_klasoru+'/'+resim_adi)
        x_train.append(resim)
        y_train.append(i)
        print(i)

x_train = np.array(x_train).astype('float32')/255.
x_train = x_train.reshape(x_train.shape[0], resim_boyutu, resim_boyutu, kanal_sayisi)
y_train = np.array(y_train).astype('float32')
y_train = to_categorical(y_train, etiket_sayisi)

#Test datasetinin hazırlanması
etiketler_test = listdir(test_klasoru)
x_test, y_test = [], []

for i, etiket in enumerate(etiketler_test):
    etiket_klasoru = test_klasoru+'/'+etiket

    for resim_adi in listdir(etiket_klasoru):
        resim = resmi_al(etiket_klasoru+'/'+resim_adi)
        x_test.append(resim)
        y_test.append(i)
        print(i)

x_test = np.array(x_test).astype('float32')/255.
x_test = x_test.reshape(x_test.shape[0], resim_boyutu, resim_boyutu, kanal_sayisi)
y_test = np.array(y_test).astype('float32')
y_test = to_categorical(y_test, etiket_sayisi)

if not os.path.exists(veriseti_klasoru+'/'):
    os.makedirs(veriseti_klasoru+'/')

np.save(veriseti_klasoru+'/x_train.npy', x_train)
np.save(veriseti_klasoru+'/x_test.npy', x_test)
np.save(veriseti_klasoru+'/y_train.npy', y_train)
np.save(veriseti_klasoru+'/y_test.npy', y_test)

#2

Random değil de elle ayrılmış train ve test verilerini eğitmek için ImageDataGenerator ile yapabildim. Başka birinin de işine lazım olursa diye buraya bırakayım kodu.

from keras.preprocessing.image import ImageDataGenerator
import keras

img_width, img_height = 100, 100
etiket_sayisi = 36 # sınıf sayısı
train_data_dir = 'drive/proje/train'
validation_data_dir = 'drive/proje/test'
veriseti_klasoru = 'drive/proje/datasetleri/100x100_gri'

classes = {
    '0': 0,
    '1': 1,
    '2': 2,
    '3': 3,
    '4': 4,
    '5': 5,
    '6': 6,
    '7': 7,
    '8': 8,
    '9': 9,
    'a': 10,
    'b': 11,
    'c': 12,
    'd': 13,
    'e': 14,
    'f': 15,
    'g': 16,
    'h': 17,
    'i': 18,
    'j': 19,
    'k': 20,
    'l': 21,
    'm': 22,
    'n': 23,
    'o': 24,
    'p': 25,
    'q': 26,
    'r': 27,
    's': 28,
    't': 29,
    'u': 30,
    'v': 31,
    'w': 32,
    'x': 33,
    'y': 34,
    'z': 35,
}

nb_train_samples = 2012
nb_validation_samples = 503


train_datagen = ImageDataGenerator(rescale=1. / 255)

test_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    color_mode='grayscale',
    batch_size=batch_size,
    class_mode='categorical', 
    classes=classes)

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    color_mode='grayscale',
    batch_size=batch_size,
    class_mode='categorical',
    classes=classes)



batch_size = 64
num_classes = 36
epochs = 70
img_rows, img_cols = 100, 100



model.fit_generator(
    train_generator,
    steps_per_epoch=nb_train_samples // batch_size,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=nb_validation_samples // batch_size)


score = model.evaluate_generator(validation_generator, nb_validation_samples/batch_size, workers=12)
print('Test loss:', score[0])
print('Test accuracy:', score[1])