■ 순환 신경망을 만드는 방법을 보여준다.
▶ 예제 코드 (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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
import keras.callbacks as callbacks import keras.models as models import keras.layers as layers import keras.utils as utils import matplotlib.pyplot as pp import numpy as np np.random.seed(5) # 손실 이력 클래스를 정의한다. class LossHistory(callbacks.Callback): def init(self): self.lossList = [] def on_epoch_end(self, batch, logDictionary = {}): self.lossList.append(logDictionary.get("loss")) # 소스 ND 배열 구하기 함수를 정의한다. def GetSourceNDArray(sourceList, windowSize): targetList = [] for i in range(len(sourceList) - windowSize): subsetList = sourceList[i:(i + windowSize + 1)] targetList.append([codeDictionary[item] for item in subsetList]) return np.array(targetList) print("데이터 로드를 시작합니다.") codeDictionary = {"c4" : 0, "d4" : 1, "e4" : 2, "f4" :3 , "g4" : 4 , "a4" : 5 , "b4" : 6, "c8" : 7, "d8" : 8, "e8" : 9, "f8" :10, "g8" : 11, "a8" : 12, "b8" : 13} indexDictionary = {0 : "c4", 1 : "d4", 2 : "e4", 3 : "f4", 4 : "g4", 5 : "a4", 6 : "b4", 7 : "c8", 8 : "d8", 9 : "e8", 10 : "f8", 11 : "g8", 12 : "a8", 13 : "b8"} sequenceList = ["g8", "e8", "e4", "f8", "d8", "d4", "c8", "d8", "e8", "f8", "g8", "g8", "g4", "g8", "e8", "e8", "e8", "f8", "d8", "d4", "c8", "e8", "g8", "g8", "e8", "e8", "e4", "d8", "d8", "d8", "d8", "d8", "e8", "f4", "e8", "e8", "e8", "e8", "e8", "f8", "g4", "g8", "e8", "e4", "f8", "d8", "d4", "c8", "e8", "g8", "g8", "e8", "e8", "e4"] sourceNDArray = GetSourceNDArray(sequenceList, windowSize = 4) trainInputNDArray = sourceNDArray[:, 0:4] trainCorrectOutputNDArray = sourceNDArray[:, 4 ] maximumIndex = 13 trainInputNDArray = trainInputNDArray / float(maximumIndex) trainInputNDArray = np.reshape(trainInputNDArray, (50, 4, 1)) trainCorrectOutputNDArray = utils.np_utils.to_categorical(trainCorrectOutputNDArray) outputNodeCount = trainCorrectOutputNDArray.shape[1] print("데이터 로드를 종료합니다.") print("모델 정의를 시작합니다.") model = models.Sequential() model.add(layers.LSTM(128, input_shape = (4, 1))) model.add(layers.Dense(outputNodeCount, activation = "softmax")) model.compile(loss = "categorical_crossentropy", optimizer = "adam", metrics = ["accuracy"]) print("모델 정의를 종료합니다.") print("모델 학습을 시작합니다.") history = LossHistory() history.init() model.fit(trainInputNDArray, trainCorrectOutputNDArray, epochs = 2000, batch_size = 14, verbose = 2, callbacks = [history]) pp.plot(history.lossList) pp.ylabel("loss") pp.xlabel("epoch") pp.legend(["train"], loc = "upper left") pp.show() print("모델 학습을 종료합니다.") print("모델 평가를 시작합니다.") evaluationList = model.evaluate(trainInputNDArray, trainCorrectOutputNDArray) print("%s : %.2f%%" % (model.metrics_names[1], evaluationList[1] * 100)) print("모델 평가를 종료합니다.") print("모델 사용을 시작합니다.") predictionCount = 50 print("한 스텝 예측을 시작합니다.") resultSequenceList = ["g8", "e8", "e4", "f8"] predictionNDArray = model.predict(trainInputNDArray) for i in range(predictionCount): index = np.argmax(predictionNDArray[i]) resultSequenceList.append(indexDictionary[index]) print("한 스텝 예측 : ", resultSequenceList) print("한 스텝 예측을 종료합니다.") print("곡 전체 예측을 시작합니다.") inputSequenceList = ["g8", "e8", "e4", "f8"] resultSequenceList = inputSequenceList inputSequenceList = [codeDictionary[item] / float(maximumIndex) for item in inputSequenceList] for i in range(predictionCount): inputSequenceNDArray = np.array(inputSequenceList) inputSequenceNDArray = np.reshape(inputSequenceNDArray, (1, 4, 1)) # 샘플 수, 타임 스텝 수, 속성 수 predictionNDArray = model.predict(inputSequenceNDArray) index = np.argmax(predictionNDArray) resultSequenceList.append(indexDictionary[index]) inputSequenceList.append(index / float(maximumIndex)) inputSequenceList.pop(0) print("곡 전체 예측 : ", resultSequenceList) print("곡 전체 예측을 종료합니다.") |