[PYTHON/KERAS] 컨볼루션 신경망 만들기 (CIFAR-10)
■ 컨볼루션 신경망을 만드는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
import keras.datasets.cifar10 as cifar10 import keras.layers.convolutional as convolutional import keras.layers.core as core import keras.models as models import keras.utils.np_utils as np_utils import matplotlib.pyplot as pp outputLayerNodeCount = 10 # 학습 및 테스트 데이터를 로드한다. (trainInputNDArray, trainCorrectOutputNDArray), (testInputNDArray, testCorrectOutputNDArray) = cifar10.load_data() print("학습 입력 배열 형태 : ", trainInputNDArray.shape) print(trainInputNDArray.shape[0], "학습 샘플 데이터" ) print(testInputNDArray.shape[0] , "테스트 샘플 데이터") trainCorrectOutputNDArray = np_utils.to_categorical(trainCorrectOutputNDArray, outputLayerNodeCount) testCorrectOutputNDArray = np_utils.to_categorical(testCorrectOutputNDArray , outputLayerNodeCount) # 입력 데이터를 정규화 한다. trainInputNDArray = trainInputNDArray.astype("float32") testInputNDArray = testInputNDArray.astype("float32") trainInputNDArray /= 255 testInputNDArray /= 255 # 모델을 정의한다. model = models.Sequential() model.add(convolutional.Conv2D(32, (3, 3), padding = "same", input_shape = (32, 32, 3))) model.add(core.Activation("relu")) model.add(convolutional.Conv2D(32, (3, 3), padding = "same")) model.add(core.Activation("relu")) model.add(convolutional.MaxPooling2D(pool_size = (2, 2))) model.add(core.Dropout(0.25)) model.add(convolutional.Conv2D(64, (3, 3), padding = "same")) model.add(core.Activation("relu")) model.add(convolutional.Conv2D(64, (3, 3), padding = "same")) model.add(core.Activation("relu")) model.add(convolutional.MaxPooling2D(pool_size = (2, 2))) model.add(core.Dropout(0.25)) model.add(core.Flatten()) model.add(core.Dense(512)) model.add(core.Activation("relu")) model.add(core.Dropout(0.5)) model.add(core.Dense(outputLayerNodeCount)) model.add(core.Activation("softmax")) model.summary() # 모델을 컴파일한다. model.compile(loss = "categorical_crossentropy", optimizer = "rmsprop", metrics = ["accuracy"]) # 모델을 학습시킨다. history = model.fit(trainInputNDArray, trainCorrectOutputNDArray, batch_size = 128, epochs = 20, validation_split = 0.2, verbose = 1) # 모델을 평가한다. print("테스트...") scoreList = model.evaluate(testInputNDArray, testCorrectOutputNDArray, batch_size = 128, verbose = 1) print("테스트 스코어 : ", scoreList[0]) print("테스트 정확도 : ", scoreList[1]) # 모델을 저장한다. json = model.to_json() open("cifar10_model.json", "w").write(json) model.save_weights("cifar10_weights.h5", overwrite = True) # 히스토리의 모든 데이터 목록을 표시한다. print(history.history.keys()) # summarize history for accuracy pp.plot(history.history["acc" ]) pp.plot(history.history["val_acc"]) pp.title("model accuracy") pp.ylabel("accuracy") pp.xlabel("epoch") pp.legend(["train", "test"], loc = "upper left") pp.show() # 손실 히스토리를 표시한다. pp.plot(history.history["loss" ]) pp.plot(history.history["val_loss"]) pp.title("model loss") pp.ylabel("loss") pp.xlabel("epoch") pp.legend(["train", "test"], loc = "upper left") pp.show() |