From ff34b12c12fd44e146e1950bc763d42603e1b244 Mon Sep 17 00:00:00 2001 From: city1616 Date: Thu, 1 Jul 2021 19:02:06 +0900 Subject: [PATCH] =?UTF-8?q?keras=20model=20code=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/keras_model.py | 130 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 code/keras_model.py diff --git a/code/keras_model.py b/code/keras_model.py new file mode 100644 index 0000000..d30255d --- /dev/null +++ b/code/keras_model.py @@ -0,0 +1,130 @@ +import librosa +import scipy.signal as signal +import tensorflow as tf +from tensorflow.keras.models import Sequential +from tensorflow.keras.layers import Dense +import numpy as np + +x_train = [] +y_train = [] +chords = ['C', 'D', 'E', 'F', 'G', 'A', 'B', 'HC'] +path = '/Users/seungwoomun/Documents/MYC/train/Grand Piano/' +paths = '/Users/seungwoomun/Documents/MYC/train/Grand Piano/C_1.wav' + +# file_name = ["C_1.wav", "D_1.wav"] +# 도는 [1,0], 레는 [0,1]로 설정한다 +lable = [[1, 0, 0, 0, 0, 0, 0, 0], # 도 C + [0, 1, 0, 0, 0, 0, 0, 0], # 레 D + [0, 0, 1, 0, 0, 0, 0, 0], # 미 E + [0, 0, 0, 1, 0, 0, 0, 0], # 파 F + [0, 0, 0, 0, 1, 0, 0, 0], # 솔 G + [0, 0, 0, 0, 0, 1, 0, 0], # 라 A + [0, 0, 0, 0, 0, 0, 1, 0], # 시 B + [0, 0, 0, 0, 0, 0, 0, 1]] # 도 HC + +# train data 생성 +for index in range(len(chords)): + audio_sample, sampling_rate = librosa.load(path + chords[index] + '_1.wav', sr = 44100) + input_data = np.abs(librosa.stft(audio_sample, n_fft = 2048, hop_length = 1024, win_length = 2048, window=signal.hann)) + + # input_data의 배열 형태를 알아본다 + shape = np.shape(input_data) + nb_samples = shape[0] + nb_windows = shape[1] + + # [nb_samples][nb_windows] 형태이므로, 딥러닝을 수행하기 위한 배열 형태 [nb_windows][nb_samples]로 맞춰준다 + input_data = input_data.T + + # 학습용 레이블 배열을 생성한다 + lable_tmp = [lable[index] for row in range(nb_windows)] + + # 하나의 배열로 합친다 + if index == 0: + x_train = input_data + y_train = lable_tmp + else: + x_train = np.r_[x_train, input_data] + y_train = np.r_[y_train, lable_tmp] + +# test data 생성 +for indexs in range(len(chords)): + audio_sample2, sampling_rate2 = librosa.load(path + chords[indexs] + '_3.wav', sr = 44100) + input_data2 = np.abs(librosa.stft(audio_sample2, n_fft = 2048, hop_length = 1024, win_length = 2048, window=signal.hann)) + + # input_data의 배열 형태를 알아본다 + shape2 = np.shape(input_data2) + nb_samples2 = shape2[0] + nb_windows2 = shape2[1] + + # [nb_samples][nb_windows] 형태이므로, 딥러닝을 수행하기 위한 배열 형태 [nb_windows][nb_samples]로 맞춰준다 + input_data2 = input_data2.T + + # 학습용 레이블 배열을 생성한다 + lable_tmp2 = [lable[indexs] for row in range(nb_windows2)] + + # 하나의 배열로 합친다 + if indexs == 0: + x_test = input_data2 + y_test = lable_tmp2 + else: + x_test = np.r_[x_test, input_data2] + y_test = np.r_[y_test, lable_tmp2] + +# print(x_train.shape) +# print(y_train.shape) +# print(x_test.shape) +# print(y_test.shape) + +# model 생성 +model = Sequential() + +model.add(Dense(units = 1025, input_dim = 1025)) # input_shape = (513, ) +model.add(Dense(units = 128, activation = 'relu')) +model.add(Dense(8, activation = 'softmax')) +# model.add(Dense(128, activation = 'relu')) +# model.add(Dense(8, input_dim = 128, activation = 'relu')) +# model.add(Dense(1, activation = 'sigmoid')) + +model.summary() + +model.compile(optimizer = 'sgd', loss = 'mse', metrics = ['acc']) + +# x_train = [[2, 4, 8], [3, 6, 9], [4, 8, 12]] +# y_train = [[2], [3], [4]] +# x_test = [[2, 4, 8]] + +# 학습 +model.fit(x_train, y_train, epochs = 500, verbose = 1, validation_data = (x_test, y_test)) # batch_size = 257 + +# 평가 +print("####### Model 평가 #######") +loss, acc = model.evaluate(x_test, y_test) +print("복원된 모델의 정확도: {:5.2f}%".format(100 * acc)) + +# 검증 +print("####### Model 검증 #######") +for i in range(255, 300) : + test = np.array([x_test[i]]) + # print(test) + print(model.predict(test)) + +# model 저장 +# model.save('DNN_Model_2048_500.h5') + +# W = tf.Variable(tf.random.normal([1]), name="weight") +# b = tf.Variable(tf.random.normal([1]), name="bias") + +# hypothesis=x_train*W+b + +# cost = tf.reduce_mean(tf.square(hypothesis - y_train)) +# sgd = tf.keras.optimizers.SGD(learning_rate=0.01) + +# model = Sequential() + +# model.add(Dense(1, input_dim = 1)) + +# model.compile(loss='mean_squared_error',optimizer=sgd) + +# model.fit(x_train,y_train,epochs=10) + +# print(model.predict(np.array([5])))