Machine Learning

.text section을 image resizing 후 CNN 모델생성(2)

yssy431 2020. 8. 5. 21:00

 글은 올리지 않았지만 64*64를 진행 후 성능이 생각보다 좋지않아 128*128로 리사이징을 재진행 후에 CNN 학습을 시켜보았다.

 하지만 안타깝게도 64*64나 128*128 리사이징이나 똑같이 overfitting 현상이 일어난다.

 

 

epoch이 지날때마다 traing loss는 눈에 뛰게 줄어들고 있는대 validation_data의 loss는 뒤죽박죽이다.

Dropout으로 일차적으로 overfitting을 줄여보고 정규화도 진행하였지만 상황이 나아지지 않았고 여러 방법으로 리사이징하여 CNN을 돌려보았다.

resizing 후 CNN model test 진행

사용한 코드

 

import numpy as np
import os
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Conv2D, MaxPooling2D, Flatten
import pickle

os.environ['CUDA_VISIBLE_DEVICES'] = '2'

size = 128


def model_create():
    model = Sequential()
    model.add(Conv2D(32, (2, 2),padding= 'valid', activation='relu', input_shape=(size,size,1)))
    model.add(MaxPooling2D((2, 2)))
    model.add(Dropout(0.4))
    model.add(Conv2D(16, (2, 2), activation='relu'))
    model.add(Flatten())
    model.add(Dense(8, activation='relu'))   
    model.add(Dense(1, activation='sigmoid'))
    #model.summary()
    model.compile(loss='binary_crossentropy', optimizer='Adam', metrics=['accuracy'])
    
    return model
    
def main(train_path,test_path):

    X_train,y_train = load_pickle(train_path)
    X_test,y_test = load_pickle(test_path)

    X_train = X_train/255.0
    X_test = X_test/255.0

    model = model_create()
    hist = model.fit(X.reshape(-1,size,size,1), y_train,validation_data = (X_test.reshape(-1,size,size,1),y_test),verbose = 1,epochs=N_epoch ,batch_size = b_size)

    return hist

def create_plot(*history,t_list):    
    leng = int(np.ceil(np.sqrt(len(history))))
       
    plt.figure(figsize=(12,15))
    for i,x in enumerate(history):        
        plt.subplot(leng,leng,i+1)
        plt.title(t_list[i])
        #plt.xlabel('Epoch')
        #plt.ylabel('accuracy')
        x_axis = list(map(int,x.epoch))
        acc_train = x.history['accuracy']
        acc_test = x.history['val_accuracy']
        
        plt.plot(x_axis,acc_train,label='train_accuracy')
        plt.plot(x_axis,acc_test,label='test_accuracy')
        
        plt.text(5,0.35, f'train_max : {np.max(acc_train):.3f}\n test_max : {np.max(acc_test):.3f}')
        plt.ylim([0,1])
        plt.legend()    
    plt.savefig('output.png')
    plt.show()

#7개를 전부 실행 후 create_plot으로 시각화
gaussian_h = main(train_path,test_path)

title_list = ['bilinear','bicubic','nearest','lanczos3','lanczos5','mitchellcubic', 'gaussian']
create_plot(bilinear,bicubic_h,nearest_h,lanczos3_h,lanczos5_h,mitchellcubic_h,
							gaussian_h,t_list = title_list)

 overfitting 현상을 고민하다 dataset으로 쓰는 pe파일들이 패킹된 것이 너무 많은 게 원인 일 것 같다는 예상이 든다.

20만 dataset중 11만개 정도가 패킹이 되어 있는 파일들이다. 요즘은 악성코드든 정상파일이든 패킹이 되있는 경우가 너무 많기에 동적말고는 방법이 없나 많은 고민을 하게되었다.

 추가로 20만개를 추가하여 40만개의 dataset을 구성하고 악성 정상의 비율을 1:1로 만든 후 재진행을 해보아야 할 것같다.

  현재 진행한 dataset은 20만개 중 악성 정상의 비율이 3:1의 비율이며 testset 구성은 현재 email로 뿌려지거나 excel,hwp 매크로 안에 숨겨진 링크로 다운 받아지는 최신 악성코드로 대략 1200개정도로 만들어 졌다.