выпадет слой повысить точность - PullRequest
0 голосов
/ 08 марта 2020

Я знаю, что добавление выпадающего слоя в модель CNN повышает точность, так как уменьшает влияние перенастройки. Однако я построил модель CNN с фильтрами 16,32 и 64, размерами 3 и maxpool 2 и заметил, что модель без выпадающего слоя работала лучше, чем модель с выпадающим слоем для всех случаев.

from keras.models import Sequential
from keras.layers import Conv2D,Activation,MaxPooling2D,Dense,Flatten,Dropout
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from IPython.display import display
import matplotlib.pyplot as plt
from PIL import Image
from sklearn.metrics import classification_report, confusion_matrix
import keras
from keras.layers import BatchNormalization
from keras.optimizers import Adam
import pickle

classifier = Sequential()
classifier.add(Conv2D(16,(3,3),input_shape=(200,200,3)))
classifier.add(Activation('relu'))
classifier.add(MaxPooling2D(pool_size =(2,2)))
classifier.add(Flatten())
classifier.add(Dense(128))
classifier.add(Activation('relu'))
classifier.add(Dropout(0.5))
classifier.add(Dense(7))
classifier.add(Activation('softmax'))
classifier.summary()
classifier.compile(optimizer =keras.optimizers.Adam(lr=0.001),
                   loss ='categorical_crossentropy',
                   metrics =['accuracy'])
train_datagen = ImageDataGenerator(rescale =1./255,
                                   shear_range =0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip =True)
test_datagen = ImageDataGenerator(rescale = 1./255)

batchsize=10
training_set = train_datagen.flow_from_directory('/home/osboxes/Downloads/Downloads/Journal_Paper/Malware_Families/Spectrogram/Train/',            
                                                target_size=(200,200),
                                                batch_size= batchsize,
                                                class_mode='categorical')

test_set = test_datagen.flow_from_directory('/home/osboxes/Downloads/Downloads/Journal_Paper/Malware_Families/Spectrogram/Validate/',    
                                           target_size = (200,200),
                                           batch_size = batchsize,
                       shuffle=False,
                                           class_mode ='categorical')
history=classifier.fit_generator(training_set,
                        steps_per_epoch = 2340 // batchsize,
                        epochs = 100,
                        validation_data =test_set,
                        validation_steps = 781 // batchsize)

classifier.save('16_With_Dropout_rl_001.h5')
with open('16_With_Dropout_rl_001.h5', 'wb') as file_pi:
        pickle.dump(history.history, file_pi)
Y_pred = classifier.predict_generator(test_set, steps= 781 // batchsize+1)
y_pred = np.argmax(Y_pred, axis=1)
print('Confusion Matrix')
print(confusion_matrix(test_set.classes, y_pred))
print('Classification Report')
target_names = test_set.classes
class_labels = list(test_set.class_indices.keys()) 
target_names = ['coinhive','emotet','fareit','gafgyt','mirai','ramnit','razy']  
report = classification_report(test_set.classes, y_pred, target_names=class_labels)
print(report) 

# summarize history for accuracy
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('model accuracy 16 with dropout rl .001')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
# summarize history for loss
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss 16 with dropout rl .001')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()

enter image description here enter image description here enter image description here enter image description here

Ответы [ 2 ]

2 голосов
/ 08 марта 2020

Я знаю, что добавление выпадающего слоя в модель CNN повышает точность, поскольку уменьшает влияние перенастройки.

Вы можете выразить это таким образом, но это не так держи в общем. Выпадающий слой - это метод обобщения, который уменьшает гибкость вашей модели, которая может предотвратить переоснащение, предполагая, что ваша модель достаточно гибкая для выполнения задачи (фактически, если ваша модель более гибкая, чем необходимо). Если ваша модель не способна обработать задачу с самого начала, а это означает, что она слишком слабая, то добавление любого вида регуляризации, вероятно, только ухудшит ее производительность.

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

Ваш дизайн включает только один сверточный слой. Я бы предложил сложить несколько сверточных / объединяющих слоев друг на друга и добавить несколько выпадающих слоев для борьбы с переобучением, если это необходимо (вероятно, будет трудно увидеть какие-либо положительные эффекты регуляризации на такой простой модели).

0 голосов
/ 17 марта 2020

Я согласен со всем, что сказал @Matus Dubrava, но я бы также посоветовал вам попробовать и процент отсева намного ниже 0,5. Как правило, люди используют что-то между 0,15 и 0,3. Я обычно использую 0,2. Попробуйте пару разных значений и посмотрите, что работает лучше всего. И, как предложил Матус, попробуйте еще несколько слоев свертки. У меня был большой успех с тремя архитектурами CN для табличных моделей и моделей генерации изображений.

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