【问题标题】:Why I get spiky graphs(loss vs Epochs) in CNN为什么我在 CNN 中得到尖峰图(损失 vs 时期)
【发布时间】:2020-02-01 01:21:39
【问题描述】:

这是我为 CNN 创建的代码,但我注意到损失/纪元图上的这些峰值,我无法解释。我尝试了亚当优化器,但结果仍然相同。我尝试对恶性或良性乳腺肿瘤进行分类,但我的数据集有点小,只有 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)

图损失与 Epoch:

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    SGD 和 Adam 都是随机优化器,因此损失值不一定会在每一步都减少,只要整体损失在减少,在该图中出现峰值是可以的。尽管我认为您的模型可能对训练数据过度拟合。尝试在模型的最后一个密集层之后使用正则化器或添加 dropout。在 CNN 的中间层使用 dropout 不是很传统。

    【讨论】:

      猜你喜欢
      • 2010-09-19
      • 2018-05-29
      • 2015-08-25
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多