<jupyter_start><jupyter_text>Giraffe Elephant Image Processing  URL of Images: https://drive.google.com/file/d/1mVVJE7Ck81xNQXB4cayawbXTBoa_FKuo/view?usp=sharing The images are in different  These images have to be in same directory named 'Images' for using. Last, this 'Images' folder has to be in same directory with .ipynb file, otherwise it doesn't run.<jupyter_code>import os, shutil
def createFile(PATH):
    if(not(os.path.exists(PATH) and os.access(PATH, os.R_OK))):
        os.mkdir(PATH)
def lenDirectoryElements(PATH):
    return len(os.listdir(PATH))
#Plot grafiği için tekrarlı kod yazılmasın diye.
import matplotlib.pyplot as plt
def showPlots(generatedModel):
    acc = generatedModel.history['acc']
    val_acc = generatedModel.history['val_acc']
    loss = generatedModel.history['loss']
    val_loss = generatedModel.history['val_loss']

    epochs = range(len(acc))

    plt.plot(epochs, acc, 'bo', label='Training acc')
    plt.plot(epochs, val_acc, 'b', label='Validation acc')
    plt.title('Training and validation accuracy')
    plt.legend()

    plt.figure()

    plt.plot(epochs, loss, 'bo', label='Training loss')
    plt.plot(epochs, val_loss, 'b', label='Validation loss')
    plt.title('Training and validation loss')
    plt.legend()
    plt.show()
#Ayrım yapılmamış resim klasörü
non_processing_data_dir = '.\Images'

#İşlem yapılacak klasörü
processing_data_dir = '.\ProcessingDatas'

createFile(processing_data_dir)

#Train - Test - Validation klasör oluşturma
train_dir = os.path.join(processing_data_dir, 'train')
validation_dir = os.path.join(processing_data_dir, 'validation')
test_dir = os.path.join(processing_data_dir, 'test')

createFile(train_dir)
createFile(validation_dir)
createFile(test_dir)

#Eğitim için fil ve zürafa klasörleri oluşturuluyor.
train_elephant_dir = os.path.join(train_dir, 'elephant')
train_giraffe_dir = os.path.join(train_dir, 'giraffe')
createFile(train_elephant_dir)
createFile(train_giraffe_dir)

#Değerleme işlemi için fil ve zürafa klasörleri oluşturuluyor
validation_elephant_dir = os.path.join(validation_dir, 'elephant')
validation_giraffe_dir = os.path.join(validation_dir, 'giraffe')
createFile(validation_elephant_dir)
createFile(validation_giraffe_dir)

#Sınama için fil ve zürafa klasörleri oluşturuluyor.
test_elephant_dir = os.path.join(test_dir, 'elephant')
test_giraffe_dir = os.path.join(test_dir, 'giraffe')
createFile(test_elephant_dir)
createFile(test_giraffe_dir)
#Resimler Train validation test klasörlerine gruplandırma ile sırasıyla 100 50 50 fotoğraf atılıyor.
fnames = ['elephant ({})_120x80.jpg'.format(i+1) for i in range(100)]
for fname in fnames:
    src = os.path.join(non_processing_data_dir, fname)
    dst = os.path.join(train_elephant_dir, fname)
    shutil.copyfile(src, dst)


fnames = ['elephant ({})_120x80.jpg'.format(i+1) for i in range(100, 150)]
for fname in fnames:
    src = os.path.join(non_processing_data_dir, fname)
    dst = os.path.join(validation_elephant_dir, fname)
    shutil.copyfile(src, dst)
    

fnames = ['elephant ({})_120x80.jpg'.format(i+1) for i in range(150, 200)]
for fname in fnames:
    src = os.path.join(non_processing_data_dir, fname)
    dst = os.path.join(test_elephant_dir, fname)
    shutil.copyfile(src, dst)
    

fnames = ['Giraffe ({})_120x80.jpg'.format(i+1) for i in range(100)]
for fname in fnames:
    src = os.path.join(non_processing_data_dir, fname)
    dst = os.path.join(train_giraffe_dir, fname)
    shutil.copyfile(src, dst)
    

fnames = ['Giraffe ({})_120x80.jpg'.format(i+1) for i in range(100, 150)]
for fname in fnames:
    src = os.path.join(non_processing_data_dir, fname)
    dst = os.path.join(validation_giraffe_dir, fname)
    shutil.copyfile(src, dst)
    

fnames = ['Giraffe ({})_120x80.jpg'.format(i+1) for i in range(150, 200)]
for fname in fnames:
    src = os.path.join(non_processing_data_dir, fname)
    dst = os.path.join(test_giraffe_dir, fname)
    shutil.copyfile(src, dst)
print('Total training elephant images:', lenDirectoryElements(train_elephant_dir))
print('Total validation elephant images: ', lenDirectoryElements(validation_elephant_dir))
print('Total test elephant images:', lenDirectoryElements(test_elephant_dir))
print('Total training giraffe images:', lenDirectoryElements(train_giraffe_dir))
print('Total validation giraffe images:', lenDirectoryElements(validation_giraffe_dir))
print('Total test giraffe images:', lenDirectoryElements(test_giraffe_dir))
from keras import layers
from keras import models

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(120, 80, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

model.summary()

from keras import optimizers
model.compile(loss='binary_crossentropy',
              optimizer=optimizers.RMSprop(lr=1e-4),
              metrics=['acc'])
from keras.preprocessing.image import ImageDataGenerator

# All images will be rescaled by 1./255
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        # This is the target directory
        train_dir,
        # All images will be resized to 150x150
        target_size=(120, 80),
        batch_size=5,
        # Since we use binary_crossentropy loss, we need binary labels
        class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
        validation_dir,
        target_size=(120, 80),
        batch_size=5,
        class_mode='binary')
for data_batch, labels_batch in train_generator:
    print('data batch shape:', data_batch.shape)
    print('labels batch shape:', labels_batch.shape)
    break
standartEpoch = model.fit_generator(
      train_generator,
      steps_per_epoch=100,
      epochs=30,
      validation_data=validation_generator,
      validation_steps=50)
model.save('ElephantOrGiraffeStandartEpoch.h5')
showPlots(standartEpoch)<jupyter_output><empty_output><jupyter_text>Görüldüğü üzere doğruluk grafiğinde %100 başarı oranı mükemmel ama yanlış için. ```shAşırı uyma (over fitting) görülüyor, ```Doğrulama doğruluk oranı 75 80 lerde eğitim doğruluk oranı %100 Dünya'da zürafa ve fil açısından tek resim verilerindeki hayvanlar olmadığı sürece yanlış bir öğrenim durumudur.Kayıp grafiğinde de aynı mükemmellik bulunmakta sonlara doğru doğrulama kısmı biraz daha gerçekçilik gösterse de bu yetersiz kalıyor.Bu şu anlama geliyor, kısaca veriler yetersiz kalıyor.<jupyter_code>datagen = ImageDataGenerator(
      rotation_range=40,
      width_shift_range=0.2,
      height_shift_range=0.2,
      shear_range=0.2,
      zoom_range=0.2,
      horizontal_flip=True,
      fill_mode='nearest')
from keras.preprocessing import image

def augmentImages(image_dir):

    fnames = [os.path.join(image_dir, fname) for fname in os.listdir(image_dir)]

    # We pick one image to "augment"
    img_path = fnames[3]

    # Read the image and resize it
    img = image.load_img(img_path, target_size=(120, 80))

    # Convert it to a Numpy array with shape (150, 150, 3)
    x = image.img_to_array(img)

    # Reshape it to (1, 150, 150, 3)
    x = x.reshape((1,) + x.shape)

    # The .flow() command below generates batches of randomly transformed images.
    # It will loop indefinitely, so we need to `break` the loop at some point!
    i = 0
    for batch in datagen.flow(x, batch_size=1):
        plt.figure(i)
        imgplot = plt.imshow(image.array_to_img(batch[0]))
        i += 1
        if i % 4 == 0:
            break

    plt.show()

augmentImages(train_giraffe_dir)
augmentImages(train_elephant_dir)
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
                        input_shape=(120, 80, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer=optimizers.RMSprop(lr=1e-4),
              metrics=['acc'])
train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=40,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,)

test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        train_dir,
        target_size=(120, 80),
        batch_size=5,
        class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
        validation_dir,
        target_size=(120, 80),
        batch_size=5,
        class_mode='binary')

augmentedEpoch = model.fit_generator(
      train_generator,
      steps_per_epoch=100,
      epochs=30,
      validation_data=validation_generator,
      validation_steps=50)
model.save('augmentationEpoch.h5')
showPlots(augmentedEpoch)<jupyter_output><empty_output><jupyter_text>Baştaki sıradan epoch eğitiminden sonra grafiklerde daha gerçekçi bir durum oluşmakta, Doğrulama ve eğitme doğruluk oranlarına bakıldığında birbirine bazı yerler hariç yakın seyretmekte. Hata durumlarına baktığımızda eğitim kümesinin belli bir eğimle gittiğini ve doğrulama kısmının farklı durumlara çıktığını görüyoruz. Doğrulama kısmında çok uç hata durumları çıkmakta. Yapılanların yeterli olmaması durumu olabilir verilerin sorunlu olması anlamına da gelebilir.```shDoğruluk kısmının bu sonuçla çıkması, daha çok eşleşme durumu yapılmasından dolayı olabilir bundan dolayı nöron durumlarında göz ardı etmemiz gerekenler olduğu anlamına geliyor olabilir. Sonlara doğruluk kısmında tavan değerlere yaklaşmaktadır bu aşırı uyma durumu olduğu anlamına gelir.``` Not : Gerçeklikten kasıt, kullanılabilecek bir algoritmaya yakınlık anlamındadır.<jupyter_code>model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(120, 80, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5)) # Dropout katmanını ekliyoruz.
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer=optimizers.RMSprop(lr=1e-4),
              metrics=['acc'])
dropOutEpoch = model.fit_generator(
      train_generator,
      steps_per_epoch=100,
      epochs=30,
      validation_data=validation_generator,
      validation_steps=50)
model.save('dropOutEpoch.h5')
showPlots(dropOutEpoch)<jupyter_output><empty_output><jupyter_text>Doğruluk kısmındaki başlardaki kaos ortamı haricinde doğrulama ve eğitim kısmının doğruluk oranlarının birbirine daha yakınlaştığı söylenebilir. Aynı doğrultuda artmasının yaşandığı söylenebilir. Önceki grafiğe göre daha yayılımlı bir grafik görülmekte. Önceki grafikte daha orantısal gitmekteydi. Bu grafikte mümkün olduğunca aşırı uyumadan kaçınıldığı söylenebilir.```shDaha az aşırı uyma durumunun olduğu doğruluk oranının artık tavan değeri görmemesi sayesinde belli olmaktadır.Daha iyi bir dropout değeriyle daha güzel sonuçlar elde edilebilir.Hata grafiği daha istikrarlı hale gelmiştir.Kısacası aşırı uyma durumu daha da azaltılmıştır. ```<jupyter_code>from keras.callbacks import EarlyStopping

earlystop_callback = EarlyStopping(monitor='val_acc', mode='max', verbose = 1)
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(120, 80, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5)) # Dropout katmanını ekliyoruz.
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer=optimizers.RMSprop(lr=1e-4),
              metrics=['acc'])
limitedEpoch = model.fit_generator(
      train_generator,
      steps_per_epoch=100,
      epochs=30,
      callbacks=[earlystop_callback],
      validation_data=validation_generator,
      validation_steps=50)<jupyter_output>Epoch 1/30
100/100 [==============================] - 5s 54ms/step - loss: 0.6988 - acc: 0.4880 - val_loss: 0.6852 - val_acc: 0.5480
Epoch 2/30
100/100 [==============================] - 5s 49ms/step - loss: 0.6870 - acc: 0.5600 - val_loss: 0.6953 - val_acc: 0.6760
Epoch 3/30
100/100 [==============================] - 5s 48ms/step - loss: 0.6838 - acc: 0.5520 - val_loss: 0.9214 - val_acc: 0.5120
Epoch 00003: early stopping<jupyter_text>Callbacks kısmına early stopping kondu. Nedeni her çalıştırımda farklı değerler çıkacağı için bir earlystop konması daha mantıklıydı. Bunun grafiği alttaki grafiklerde verilecektir. Tüm durum karşılaştırmaları<jupyter_code>showPlots(standartEpoch)<jupyter_output><empty_output><jupyter_text>Aşırı uyma bariz bellidir.<jupyter_code>showPlots(augmentedEpoch)<jupyter_output><empty_output><jupyter_text>Farklı açılardan resim üretimi sayesinde aşırı uyuma biraz engellenmiş durumdadır.<jupyter_code>showPlots(dropOutEpoch)<jupyter_output><empty_output><jupyter_text>Sadece farklı açılardan resim üretimi olduğunda doğrulamada %90 lara varan eğitimde %85 lere varan doğruluk durumu vardı az veri olduğu aşırı eğitim olduğu anlamına gelir. Dropout sayesinde bu aşırı uyma daha da engellenmiş oldu.<jupyter_code>showPlots(limitedEpoch)<jupyter_output><empty_output><jupyter_text>3.Epoch'ta durdu nedeni 3.Epoch'ta doğrulama kısmında düşüş yaşanmıştı. Çalıştırmadan çalıştırmaya değişebilecek bir grafik. Burada şu yorum yapılabilir: -Veriler daha kaliteli olmalı ki bu daha fazla eğitim zamanı anlamına gelir. -Dropout kısmı düşürülmeli 0.4 0.3 0.2 0.1' den en uygunu bulunmalıdır. -Erken kesme daha hızlı eğitim ve dah az maliyet sağlamıştır. Tabii bunun karşılığında daha az başarı oranına da sebebiyet vermiştir.  Kesin olarak şu söylenebilir aşırı uyma durumu engellenmiştir ama bu amaçtan dolayı da başarı oranından ciddi taviz verilmiştir.<jupyter_code>def compileWithDropout(dropOutValue):
    model = models.Sequential()
    model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(120, 80, 3)))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(128, (3, 3), activation='relu'))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(128, (3, 3), activation='relu'))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Flatten())
    model.add(layers.Dropout(dropOutValue)) # Dropout katmanını ekliyoruz.
    model.add(layers.Dense(512, activation='relu'))
    model.add(layers.Dense(1, activation='sigmoid'))

    model.compile(loss='binary_crossentropy',
                  optimizer=optimizers.RMSprop(lr=1e-4),
                  metrics=['acc'])

    limitedEpoch = model.fit_generator(
          train_generator,
          steps_per_epoch=100,
          epochs=30,
          callbacks=[earlystop_callback],
          validation_data=validation_generator,
          validation_steps=50)

    showPlots(limitedEpoch)
for i in range(1,5):
    compileWithDropout(i/10)<jupyter_output>Epoch 1/30
100/100 [==============================] - 5s 55ms/step - loss: 0.6916 - acc: 0.5280 - val_loss: 0.6920 - val_acc: 0.7200
Epoch 2/30
100/100 [==============================] - 5s 50ms/step - loss: 0.6648 - acc: 0.6340 - val_loss: 0.9121 - val_acc: 0.6360
Epoch 00002: early stopping
{'fraction_non_alphanumeric': 0.12306949806949807, 'fraction_numerical': 0.03903233590733591, 'mean_word_length': 5.030192797380866, 'pattern_counts': {'":': 0, '<': 35, '<?xml version=': 0, '>': 35, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '266014', 'license': 'Unlicense', 'n_tokens_mistral': 6858, 'n_tokens_neox': 6270, 'n_words': 1261, 'path': 'giraffe_elephant.ipynb', 'repo_name': 'alparslancay/Giraffe-Elephant-Image-Processing', 'size': '16576'}