ecsimsw

Keras 본문

Keras

JinHwan Kim 2020. 2. 2. 22:54

Keras

 

   : 딥러닝을 쉽게 하도록 만들어진 인공 신경망 라이브러리. 

 

   - 예시는 https://ecsimsw.tistory.com/entry/Keras-%ED%99%9C%EC%9A%A9의 BMI 계산 학습의 내용이다.

 

모델 구성 / model.compile()

model = Sequential()
model.add(Dense(512, input_shape=(2,)))
model.add(Activation('relu'))
model.add(Dropout(0.1))

model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.1))

model.add(Dense(3))
model.add(Activation('softmax'))

model.compile(
    loss='categorical_crossentropy',
    optimizer='rmsprop',
    metrics=['accuracy']
)

학습 / model.fit()

hist = model.fit(
    X_train, y_train,
    batch_size=100,
    epochs=20,
    validation_split=0.1,
    callbacks=[EarlyStopping(monitor='val_loss', patience=2)],
    verbose=1
)

1) arguments.

 

- batch_size: Number of samples per gradient update. Default is 32.

 

- epochs : Iteration over the entire x and y data provided 

 

- validation_split: Fraction of the training data to be used as validation data. The model will set apart this fraction of the training data, will not train on it, and will evaluate the loss and any model metrics on this data at the end of each epoch.

 

2) data type.

 

 - 학습 데이터는 numpy Array 와 List of Arrays 로 받는다.

csv = pd.read_csv(dataSrc+'/write.csv') #type(csv) : pandas.core.frame.DataFrame
X = csv[['weight', 'height']].values  #type(X) : numpy.ndarray

bclass = {'thin': [1, 0, 0], 'normal': [0, 1, 0], 'fat': [0, 0, 1]}

y = np.empty((20000, 3))
for i, v in enumerate(csv['label']):
    y[i] = bclass[v]

X_train, y_train = X[1:15001], y[1:15001]
X_test, y_test = X[15001:20001], y[15001:20001]

   ## 예시에서는 csv파일을 Pandas의 Dataframe으로 받고 dataframe.values를 이용하여 numpy array로 바꿔 대입하였다. 

 

예측 / predict, predict_class

 

   - predict는 해당 객체를 예측하고 그 결과를 반환한다. 예를들어, 아래 코드 처럼 학습이 마친 후 이 학습물에 [[50.5,156]]의 2차원 객체를 대입하여 예측할 경우, 각 레이블당 0.5255 / 0.4738 / 0.0006 의 weight를 갖는다는 말이된다.

 

   ## 예시는 50.5kg/ 156cm의 bmi 상태를 체크한 것으로, thin이 첫번째 레이블, normal이 두번째 레이블, fat이 세번째 레이블을 가리킨다. 즉 학습된 결과로 예측할 시, 이 사람은 마름과 보통 사이인데 마름쪽에 더 가깝다고 예측한 것이다.  

X_temp = np.array([[50.5,156]])
pre = model.predict_classes(X_temp)
print(str(X_temp)+" => "+ str(pre))

#result 
#[[ 50.5 156. ]] => [[0.52550274 0.4738726  0.00062468]]

   - Predict_classes는 predict에 의해 가장 신뢰도를 얻은 레이블을 표시한다.  위와 같은 예시로 첫번째 레이블, [0]을 표시한다.

X_temp = np.array([[50.5,156]])
pre = model.predict_classes(X_temp)
print(str(X_temp)+" => "+ str(pre))

#result
#[[ 50.5 156. ]] => [0]

 

오답 확인 / Check wrong answers

 

 - predict_classes로 데이터의 분류 결과를 받으면 데이터별 예측된 레이블이 배열로 표시될 것이고, 그것이 y_test의 데이터별 레이블과 맞는지 비교해야한다.

 

 - 이때, y_test의 레이블 0,1,2은 [1,0,0] [0,1,0] [0,0,1]으로 표현이 되므로 y_test의 각 열(y_test[i])에서 1이 어딨는지( np.where(y_test[i]==1) 또는 각 열에서 가장 큰 것의 인덱스는 무엇인지(y_test[i].agrmax())을 이용해서 정답 레이블을 빼낸다.   

pre = model.predict_classes(X_test)

wrongIndexList = []
for i, v in enumerate(pre):
    ans = np.where(y_test[i]==1)[0][0] # 또는 y_test[i].agrmax()
    if(v!=ans):
        wrongIndexList.append(i)

for wrongIndex in wrongIndexList:
    print("X : ", (X_test[wrongIndex][0]))
    print("pre : ", pre[wrongIndex])
    print("ans : ", np.where(y_test[wrongIndex]==1)[0][0])
    print("re-cal : ", (X_test[wrongIndex])[0][0]/((X_test[wrongIndex])[0][1]/100)**2 )

 

모델 저장, 불러오기 / Save & Load

 

  - 학습한 model과 weight는 각각 json, h5 형태로 저장한다.

from keras.models import model_from_json 

  - 위와 같이 model_from_json 라이브러리를 import한다.

modelJson = model.to_json()

with open(dataSrc+"/model.json", "w") as jsFile: 
    jsFile.write(modelJson)

model.save_weights(dataSrc+"/model.h5")

   - model을 저장할 때는 model.to_json(), 불러올 때는 model_from_json() 메소드를 사용한다. 

 

   - weight는 model.save_weight()으로 저장한다. 로드할 때는 적재하고자 하는 model을 준비한 상태에서 해당 model의 load_weight 메소드를 사용하여 모델에 불러온다.

with open(dataSrc+"/model.json", "r") as jsFile:
    loaded_json = jsFile.read()

loaded_model = model_from_json(loaded_json)
loaded_model.load_weights(dataSrc+"/model.h5")
Comments