Почему я получаю колючие графики (потери против эпох) в CNN - PullRequest
2 голосов
/ 31 января 2020

Это код, который я создал для CNN, но я заметил эти всплески на графике потерь / эпох и не могу объяснить. Я попробовал Adam Optimizer, но результаты все те же. Я пытаюсь классифицировать злокачественные или доброкачественные опухоли молочной железы, но мой набор данных имеет небольшие размеры: всего 3390 изображений.

# -*- coding: utf-8 -*-
    """
    Created on Wed Dec 18 16:05:12 2019

    @author: Panagiotis Gkanos
    """
    import numpy as np 
    import tensorflow as tf
    from numpy.random import seed
    seed(1)

    tf.compat.v1.set_random_seed(2)
    from tensorflow.python.client import device_lib
    print(device_lib.list_local_devices())
    import tensorflow as tf
    sess = tf.compat.v1.Session(config=tf.compat.v1.ConfigProto(log_device_placement=True))

    import os
    os.environ['KERAS_BACKEND']='tensorflow'


    import keras
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten
    from tensorflow.keras.layers import Conv2D,MaxPooling2D
    from keras.utils import np_utils
    from tensorflow.keras.optimizers import SGD
    from tensorflow.keras.metrics import categorical_crossentropy
    from keras.preprocessing.image import ImageDataGenerator
    from tensorflow.keras.layers import BatchNormalization
    import matplotlib as plt
    from matplotlib import pyplot as plt
    from sklearn.metrics import confusion_matrix
    import itertools

    keras.initializers.glorot_normal(seed=42)

    train_path='C:/Users/Panagiotis Gkanos/Desktop/dataset/40X/train'
    train_batches=ImageDataGenerator(rescale=1./255, 
    samplewise_center=True,rotation_range=180).flow_from_directory(train_path,
                                                      target_size=[224,224],
                                                      classes=['malignant','benign'],
                                                      class_mode='categorical',batch_size=80)

    test_path='C:/Users/Panagiotis Gkanos/Desktop/dataset/40X/test'
    test_batches=ImageDataGenerator(rescale=1./255, 
    samplewise_center=True,rotation_range=180).flow_from_directory(test_path,
                                                      target_size=[224,224],
                                                      classes=['malignant','benign'],
                                                      class_mode='categorical',batch_size=80)




    model=Sequential()
    model.add(Conv2D(16,(3,3),padding='same',input_shape=(224,224,3)))
    model.add(Activation('relu'))
    model.add(Conv2D(16,(3,3),padding='same'))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2),strides=2))
    model.add(Dropout(0.3))

    model.add(Conv2D(32,(3,3),padding='same'))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2),strides=2))
    model.add(Dropout(0.3))


    model.add(Flatten())
    model.add(Dense(512,activation='relu'))
    model.add(Dense(2,activation='softmax'))
    sgd = SGD(lr=0.01)
    model.compile(optimizer=sgd,loss='categorical_crossentropy',metrics=['accuracy'])
    history=model.fit_generator(train_batches,steps_per_epoch=20 ,validation_data=test_batches,
                    validation_steps=8 ,epochs=50)



    def plot_loss(history):
        train_loss=history.history['loss']
        val_loss=history.history['val_loss']
        x=list(range(1,len(val_loss)+1))
        plt.plot(x,val_loss,color='red',label='validation loss')
        plt.plot(x,train_loss,label='training loss')
        plt.xlabel('Epoch')
        plt.ylabel('Loss')
        plt.title('Loss vs. Epoch')
        plt.legend()

        plot_loss(history)

График потерь по сравнению с эпохой:

Graph Loss vs Epoch

1 Ответ

2 голосов
/ 31 января 2020

И SGD, и Адам являются стохастиками c оптимизаторами, поэтому значение потерь не обязательно будет уменьшаться на каждом шаге, и вполне допустимо иметь пики на этом графике, пока потеря в целом уменьшается. Хотя я думаю, что ваша модель может быть перегружена тренировочными данными. Попробуйте использовать регуляризаторы или добавьте выпадение после последнего плотного слоя модели. Не очень принято использовать отсев в средних слоях CNN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...