Machine Learning

pefile 악성코드 판단하는 CNN 모델 - 모델생성

yssy431 2020. 7. 30. 00:29

데이터 전처리가 끝난 후 64*64 = 4096 size의 data를 학습하는 CNN 모델을 생성

앞에 데이터 전처리 과정 코드가 frombuffer를 

data = np.frombuffer(raw_data, dtype = np.uint8)

로 수정하여 데이터 재 추출 작업을 하였다. np.uint8로 추출 하게 되면

binary array -> img -> numpy array resize 결과 값과 동일하게 리사이징 되는 것을 확인 가능(gray scale로 추출할때)

아직까지 픽셀 하나 하나의 값이 0~255의 값이 저장이 되는대 img의 크기가 사이즈를 변경 할때 확대가 되었다 축소가 되었을 때 값이 정확히 어떻게 바뀌는지 어떠한 알고리즘이 사용되는지 확인을 하지 못하였다.

일단 간단하게 https://www.tensorflow.org/tutorials/images/cnn?hl=ko 

 

합성곱 신경망  |  TensorFlow Core

Note: 이 문서는 텐서플로 커뮤니티에서 번역했습니다. 커뮤니티 번역 활동의 특성상 정확한 번역과 최신 내용을 반영하기 위해 노력함에도 불구하고 공식 영문 문서의 내용과 일치하지 않을 수

www.tensorflow.org

 

예제의 CNN모델 코드를 가져다가 사용하여 결과 값을 바로 확인하도록 하겠다.

import numpy as np
import os
from tqdm import tqdm
import pandas as pd
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Conv2D, MaxPooling2D, Flatten
import pickle

with open('./first_data.pkl','rb') as fr:
    X = pickle.load(fr)
    y = pickle.load(fr)
X = X.reshape(-1,64,64,1)
X = X/255.0

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

model = Sequential()
model.add(Conv2D(64, (3, 3), activation='relu', input_shape=(64,64, 1)))
model.add(MaxPooling2D((3, 3)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(Flatten())
model.add(Dense(16, activation='relu'))

model.add(Dense(1, activation='sigmoid'))
model.summary()
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=10 ,batch_size = 10)
test_loss, test_acc = model.evaluate(X_test,  y_test, verbose=1)

결과 값 : accuracy 0.9066으로 괜찮은 성능이 나오는 것을 확인

- 추후에 scaling 방법이나 resize값에 따라 어떻게 성능이 달라지는지 그리고 리사이징 알고리즘들을 확인 하는 것이 목표이다. 간단하게 tensorflow image generator를 사용하여 resize를 하는 방법이 있엇지만 자세한 방법을 알기 위해 직접 구현 해볼 예정이다.