TensorFlow - 윈디하나의 솔라나라

목차

개요

설치

GPU 가속

우분투

윈도

윈도에서 설치하는 방법에 대해 다룬다.

텐서플로 설치 확인

텐서플로가 제대로 설치되었는지 확인해보자.

윈도와 리눅스 프롬프트 주의

하기 예제에서, 윈도와 리눅스로 표기된 부분이 서로 다르다. 기본적으로 이 문서는 윈도에서 텐서플로 GPU으로 작성하였지만, 샘플 코드는 윈도및 리눅스, 텐서플로 CPU 및 텐서플로 GPU버전에서도 테스트하였다. 하기 예제에서 윈도용인지 리눅스용인지 구분은 프롬프트로 하면 된다.

- 윈도용 프롬프트

(tensorflow_gpuenv) C:\Users\windy>

- 리눅스용 프롬프트

(venv) windy@wll:~$ 

현시점에서 사용한 텐서플로 버전은 2.0.0이다.


텐서플로 2.0 호환성

텐서플로 1.x와 2.0 이 많이 변경되었기 때문에, 텐서플로 1.x용 소스코드를 2.0에서 사용하기 위해 제법 많은 소스코드를 수정해야할 수도 있다. 이를 위해 텐서플로 2.0에서는 tf_upgrade_v2(1)을 제공해준다.

tf_upgrade_v2 --infile infile --outfile outfile
자세한 사항은 tf_upgrade_v2 -h를 참고하자. 디렉토리에 있는 전체 소스를 변경하거나, .ipynb 파일도 변환할 수 있다.

라이브러리 설치

텐서플로 사용

LSTM 을 사용한 예측

tensorflow_keras_lstm_stateful_2.py
(7,979 바이트)
#!/usr/bin/env python
# coding: utf-8

# In[1]:


# 0. 사용할 패키지 불러오기
import os
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
from keras.utils import np_utils

# 랜덤시드 고정시키기
np.random.seed(5)


# In[2]:


# 가중치 저장 파일
checkpoint_path = "output/checkpoint/weight.ckpt"
# 텐서보드 저장 경로(디렉토리)
tensorboard_path = "output/tensorboard"
# 모델 저장 파일
model_path = "output/model.h5"

# 손실 이력 클래스 정의
class LossHistory(keras.callbacks.Callback):
    def init(self):
        self.losses = []
        
    def on_epoch_end(self, batch, logs={}):
        self.losses.append(logs.get('loss'))

# 데이터셋 생성 함수
def seq2dataset(seq, window_size):
    dataset_X = []
    dataset_Y = []
    
    for i in range(len(seq)-window_size):
        # subset = [['g8', 'e8', 'e4', 'f8', 'd8'],
        # ['e8', 'e4', 'f8', 'd8', 'd4']...]
        subset = seq[i:(i+window_size+1)]
        
        for si in range(len(subset)-1):
            # subset[si] 에는 g8이
            features = code2features(subset[si])
            # feature 에는 [0.666, 1]이
            dataset_X.append(features)

        
        dataset_Y.append([code2idx[subset[window_size]]])
        
    return np.array(dataset_X), np.array(dataset_Y)

# 속성 변환 함수
def code2features(code):
    features = []
    features.append(code2scale[code[0]]/float(max_scale_value))
    features.append(code2length[code[1]])
    return features


# In[3]:


# 1. 데이터 준비하기

# 코드 사전 정의
# 도레미파솔라시도 이기 때문에 0 ~ 6까지
code2scale = {'c':0, 'd':1, 'e':2, 'f':3, 'g':4, 'a':5, 'b':6}
code2length = {'4':0, '8':1}

code2idx = {'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}

idx2code = {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'}

# 최대 6까지 나옴
max_scale_value = 6.0
    
# 시퀀스 데이터 정의
seq = ['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']


# In[4]:


# 2. 데이터셋 생성하기
# 여기서 windows_size =4 부분은 LSTM 에 들어가는 timestep = 4 와 동일하다.
# 4개의 데이터 추이를 보고 다음의 것을 추론하는 형태로 구성할 것이다.
x_train, y_train = seq2dataset(seq, window_size = 4)
# x_train
# array([[0.66666667, 1.        ],
#       [0.33333333, 1.        ],
#       [0.33333333, 0.        ],
#       [0.5       , 1.        ],
# y_train
# array([[ 8],
#       [ 1],
#       [ 7],
#       [ 8],


# In[5]:


# 입력을 (샘플 수, 타임스텝, 특성 수)로 형태 변환
x_train = np.reshape(x_train, (50, 4, 2))
# array([[[0.66666667, 1.        ],
#        [0.33333333, 1.        ],
#        [0.33333333, 0.        ],
#        [0.5       , 1.        ]],
#
#       [[0.33333333, 1.        ],
#        [0.33333333, 0.        ],
#        [0.5       , 1.        ],
#        [0.16666667, 1.        ]],


# In[6]:


# 라벨값에 대한 one-hot 인코딩 수행
# [8] -> [0,0,0,0,0,0,0,0,1,0,0,0]
# [1] -> [0,1,0,0,0,0,0,0,0,0,0,0]
# 최대값은 12이므로 출력되는 배열의 개수가 12개임
y_train = np_utils.to_categorical(y_train)
# array([[0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
#       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],


# In[7]:


one_hot_vec_size = y_train.shape[1]
#print("one hot encoding vector size is ", one_hot_vec_size)
# numpy 에서 행이 2이고 열이 3인 2차원 배열에서 rank는 2 이고, shape는 (2, 3)


# In[8]:


# 3. 모델 구성하기
# 상태유지 모델(stateful=True) 에서, 배치 크기 = 1, 타임스탭 = 4, 속성개수(입력 값의 개수) = 2
# LSTM에서 상태유지모델에서 배치크기 1의 의미는, 동시에 상태를 유지할 개수다. 여기서는 곡 1개만 학습할것이라 1로 했다. 가중치는 공유된다.
# LSTM에서 상태를유지하지않는 모델에서 배치크기는 상태를 유지할 개수. 1이면 상태를 유지하지 않는다.

def create_LSTM_model():
    model = Sequential()
    # 아래에서 128 은 특별히 의미가 없다. ^^
    model.add(LSTM(128, batch_input_shape = (1, 4, 2), stateful=True))
    model.add(Dense(one_hot_vec_size, activation='softmax'))
    return model

def create_StackedLSTM_model():
    model = Sequential()
    model.add(LSTM(32, return_sequences=True, stateful=True,batch_input_shape=(1, 4, 2)))
    model.add(LSTM(32, return_sequences=True, stateful=True))
    model.add(LSTM(32, stateful=True))
    model.add(Dense(one_hot_vec_size, activation='softmax'))
    return model


model = create_StackedLSTM_model()
model.summary()


# In[9]:


# 4. 모델 학습과정 설정하기
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])


# In[10]:


# 5. 모델 학습시키기
# 테스트삼아 20개로 했다. 10000 번은 해야 함.
num_epochs = 20

history = LossHistory() # 손실 이력 객체 생성
history.init()

# 가중치 저장
#checkpoint_dir = os.path.dirname(os.path.abspath(checkpoint_path))
#if not os.path.exists(checkpoint_dir):
#    os.makedirs(checkpoint_dir)
#print("CheckPoint DIR: ", checkpoint_dir)
#cp_callback = tf.keras.callbacks.ModelCheckpoint(checkpoint_path, save_weights_only=True, verbose=1)

# 텐서보드용 로그 저장
tb_hist = keras.callbacks.TensorBoard(log_dir=tensorboard_path, histogram_freq=0, write_graph=True, write_images=True)

# 학습 시작
for epoch_idx in range(num_epochs):
    print ('epochs : ' + str(epoch_idx) )
    model.fit(x_train, y_train, epochs=1, batch_size=1, verbose=2, shuffle=False, callbacks=[history, tb_hist]) # 50 is X.shape[0]
    model.reset_states() # 곡 전체에 대한 시퀀스를 학습시키므로, 한곡이 끝날때에 상태 리셋하면 됨


# In[11]:


# 6. 학습과정 살펴보기
get_ipython().run_line_magic('matplotlib', 'inline')
import matplotlib.pyplot as plt

plt.plot(history.losses)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train'], loc='upper left')
plt.show()


# In[12]:


# 7. 모델 평가 및 가중치 저장
loss, acc = model.evaluate(x_train, y_train, batch_size=1)
print("복원된 모델의 정확도: {:5.2f}%".format(100*acc))

# 모델 저장
model.save_weights(checkpoint_path)
# HDF5 포맷으로 저장
model.save(model_path)

model.reset_states()


# In[13]:


# 8. 모델 사용하기

pred_count = 50 # 최대 예측 개수 정의

# 한 스텝 예측

seq_out = ['g8', 'e8', 'e4', 'f8']
pred_out = model.predict(x_train, batch_size=1)

for i in range(pred_count):
    idx = np.argmax(pred_out[i]) # one-hot 인코딩을 인덱스 값으로 변환
    seq_out.append(idx2code[idx]) # seq_out는 최종 악보이므로 인덱스 값을 코드로 변환하여 저장
    
print("one step prediction : ", seq_out)

model.reset_states()

# 곡 전체 예측

seq_in = ['g8', 'e8', 'e4', 'f8']
seq_out = seq_in

seq_in_featrues = []

for si in seq_in:
    features = code2features(si)
    seq_in_featrues.append(features)

for i in range(pred_count):
    sample_in = np.array(seq_in_featrues)
    sample_in = np.reshape(sample_in, (1, 4, 2)) # 샘플 수, 타입스텝 수, 속성 수
    pred_out = model.predict(sample_in)
    idx = np.argmax(pred_out)
    seq_out.append(idx2code[idx])
    
    features = code2features(idx2code[idx])
    seq_in_featrues.append(features)
    seq_in_featrues.pop(0)

model.reset_states()
    
print("full song prediction : ", seq_out)


# In[ ]:




tensorflow_keras_lstm_stateful_2_load.py
(6,609 바이트)
#!/usr/bin/env python
# coding: utf-8

# In[1]:


# 0. 사용할 패키지 불러오기
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
from keras.utils import np_utils

# 랜덤시드 고정시키기
np.random.seed(5)


# In[2]:


# 가중치 저장 파일
checkpoint_path = "output/checkpoint/weight.ckpt"
# 텐서보드 저장 경로(디렉토리)
tensorboard_path = "output/tensorboard"
# 모델 저장 파일
model_path = "output/model.h5"


# 손실 이력 클래스 정의
class LossHistory(keras.callbacks.Callback):
    def init(self):
        self.losses = []
        
    def on_epoch_end(self, batch, logs={}):
        self.losses.append(logs.get('loss'))

# 데이터셋 생성 함수
def seq2dataset(seq, window_size):
    dataset_X = []
    dataset_Y = []
    
    for i in range(len(seq)-window_size):
        # subset = [['g8', 'e8', 'e4', 'f8', 'd8'],
        # ['e8', 'e4', 'f8', 'd8', 'd4']...]
        subset = seq[i:(i+window_size+1)]
        
        for si in range(len(subset)-1):
            # subset[si] 에는 g8이
            features = code2features(subset[si])
            # feature 에는 [0.666, 1]이
            dataset_X.append(features)

        
        dataset_Y.append([code2idx[subset[window_size]]])
        
    return np.array(dataset_X), np.array(dataset_Y)

# 속성 변환 함수
def code2features(code):
    features = []
    features.append(code2scale[code[0]]/float(max_scale_value))
    features.append(code2length[code[1]])
    return features


# In[3]:


# 1. 데이터 준비하기

# 코드 사전 정의
# 도레미파솔라시도 이기 때문에 0 ~ 6까지
code2scale = {'c':0, 'd':1, 'e':2, 'f':3, 'g':4, 'a':5, 'b':6}
code2length = {'4':0, '8':1}

code2idx = {'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}

idx2code = {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'}

# 최대 6까지 나옴
max_scale_value = 6.0
    
# 시퀀스 데이터 정의
seq = ['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']


# In[4]:


# 2. 데이터셋 생성하기
# 여기서 windows_size =4 부분은 LSTM 에 들어가는 timestep = 4 와 동일하다.
# 4개의 데이터 추이를 보고 다음의 것을 추론하는 형태로 구성할 것이다.
x_train, y_train = seq2dataset(seq, window_size = 4)
# x_train
# array([[0.66666667, 1.        ],
#       [0.33333333, 1.        ],
#       [0.33333333, 0.        ],
#       [0.5       , 1.        ],
# y_train
# array([[ 8],
#       [ 1],
#       [ 7],
#       [ 8],


# In[5]:


# 입력을 (샘플 수, 타임스텝, 특성 수)로 형태 변환
x_train = np.reshape(x_train, (50, 4, 2))
# array([[[0.66666667, 1.        ],
#        [0.33333333, 1.        ],
#        [0.33333333, 0.        ],
#        [0.5       , 1.        ]],
#
#       [[0.33333333, 1.        ],
#        [0.33333333, 0.        ],
#        [0.5       , 1.        ],
#        [0.16666667, 1.        ]],


# In[6]:


# 라벨값에 대한 one-hot 인코딩 수행
# [8] -> [0,0,0,0,0,0,0,0,1,0,0,0]
# [1] -> [0,1,0,0,0,0,0,0,0,0,0,0]
# 최대값은 12이므로 출력되는 배열의 개수가 12개임
y_train = np_utils.to_categorical(y_train)
# array([[0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
#       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],


# In[7]:


one_hot_vec_size = y_train.shape[1]
#print("one hot encoding vector size is ", one_hot_vec_size)
# numpy 에서 행이 2이고 열이 3인 2차원 배열에서 rank는 2 이고, shape는 (2, 3)


# In[8]:


# 3. 모델 구성하기
# 상태유지 모델(stateful=True) 에서, 배치 크기 = 1, 타임스탭 = 4, 속성개수(입력 값의 개수) = 2
# LSTM에서 상태유지모델에서 배치크기 1의 의미는, 동시에 상태를 유지할 개수다. 여기서는 곡 1개만 학습할것이라 1로 했다. 가중치는 공유된다.
# LSTM에서 상태를유지하지않는 모델에서 배치크기는 상태를 유지할 개수. 1이면 상태를 유지하지 않는다.

def create_LSTM_model():
    model = Sequential()
    # 아래에서 128 은 특별히 의미가 없다. ^^
    model.add(LSTM(128, batch_input_shape = (1, 4, 2), stateful=True))
    model.add(Dense(one_hot_vec_size, activation='softmax'))
    return model

def create_StackedLSTM_model():
    model = Sequential()
    model.add(LSTM(32, return_sequences=True, stateful=True,batch_input_shape=(1, 4, 2)))
    model.add(LSTM(32, return_sequences=True, stateful=True))
    model.add(LSTM(32, stateful=True))
    model.add(Dense(one_hot_vec_size, activation='softmax'))
    return model

model = create_StackedLSTM_model()
model.summary()


# In[9]:


# 4. 모델 학습과정 설정하기
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])


# In[10]:


# 4. 가중치 로드하기
model.load_weights(checkpoint_path)

loss, acc = model.evaluate(x_train, y_train, batch_size=1)
print("복원된 모델의 정확도: {:5.2f}%".format(100*acc))


# In[11]:


# 8. 모델 사용하기

pred_count = 50 # 최대 예측 개수 정의

# 한 스텝 예측

seq_out = ['g8', 'e8', 'e4', 'f8']
pred_out = model.predict(x_train, batch_size=1)

for i in range(pred_count):
    idx = np.argmax(pred_out[i]) # one-hot 인코딩을 인덱스 값으로 변환
    seq_out.append(idx2code[idx]) # seq_out는 최종 악보이므로 인덱스 값을 코드로 변환하여 저장
    
print("one step prediction : ", seq_out)

model.reset_states()

# 곡 전체 예측

seq_in = ['g8', 'e8', 'e4', 'f8']
seq_out = seq_in

seq_in_featrues = []

for si in seq_in:
    features = code2features(si)
    seq_in_featrues.append(features)

for i in range(pred_count):
    sample_in = np.array(seq_in_featrues)
    sample_in = np.reshape(sample_in, (1, 4, 2)) # 샘플 수, 타입스텝 수, 속성 수
    pred_out = model.predict(sample_in)
    idx = np.argmax(pred_out)
    seq_out.append(idx2code[idx])
    
    features = code2features(idx2code[idx])
    seq_in_featrues.append(features)
    seq_in_featrues.pop(0)

model.reset_states()
    
print("full song prediction : ", seq_out)

tensorflow_keras_lstm_stateful_2_modelload.py
(5,376 바이트)
#!/usr/bin/env python
# coding: utf-8

# In[1]:


# 0. 사용할 패키지 불러오기
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
from keras.utils import np_utils

# 랜덤시드 고정시키기
np.random.seed(5)


# In[2]:


# 가중치 저장 파일
checkpoint_path = "output/checkpoint/weight.ckpt"
# 텐서보드 저장 경로(디렉토리)
tensorboard_path = "output/tensorboard"
# 모델 저장 파일
model_path = "output/model.h5"


# 손실 이력 클래스 정의
class LossHistory(keras.callbacks.Callback):
    def init(self):
        self.losses = []
        
    def on_epoch_end(self, batch, logs={}):
        self.losses.append(logs.get('loss'))

# 데이터셋 생성 함수
def seq2dataset(seq, window_size):
    dataset_X = []
    dataset_Y = []
    
    for i in range(len(seq)-window_size):
        # subset = [['g8', 'e8', 'e4', 'f8', 'd8'],
        # ['e8', 'e4', 'f8', 'd8', 'd4']...]
        subset = seq[i:(i+window_size+1)]
        
        for si in range(len(subset)-1):
            # subset[si] 에는 g8이
            features = code2features(subset[si])
            # feature 에는 [0.666, 1]이
            dataset_X.append(features)

        
        dataset_Y.append([code2idx[subset[window_size]]])
        
    return np.array(dataset_X), np.array(dataset_Y)

# 속성 변환 함수
def code2features(code):
    features = []
    features.append(code2scale[code[0]]/float(max_scale_value))
    features.append(code2length[code[1]])
    return features


# In[3]:


# 1. 데이터 준비하기

# 코드 사전 정의
# 도레미파솔라시도 이기 때문에 0 ~ 6까지
code2scale = {'c':0, 'd':1, 'e':2, 'f':3, 'g':4, 'a':5, 'b':6}
code2length = {'4':0, '8':1}

code2idx = {'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}

idx2code = {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'}

# 최대 6까지 나옴
max_scale_value = 6.0
    
# 시퀀스 데이터 정의
seq = ['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']


# In[4]:


# 2. 데이터셋 생성하기
# 여기서 windows_size =4 부분은 LSTM 에 들어가는 timestep = 4 와 동일하다.
# 4개의 데이터 추이를 보고 다음의 것을 추론하는 형태로 구성할 것이다.
x_train, y_train = seq2dataset(seq, window_size = 4)
# x_train
# array([[0.66666667, 1.        ],
#       [0.33333333, 1.        ],
#       [0.33333333, 0.        ],
#       [0.5       , 1.        ],
# y_train
# array([[ 8],
#       [ 1],
#       [ 7],
#       [ 8],


# In[5]:


# 입력을 (샘플 수, 타임스텝, 특성 수)로 형태 변환
x_train = np.reshape(x_train, (50, 4, 2))
# array([[[0.66666667, 1.        ],
#        [0.33333333, 1.        ],
#        [0.33333333, 0.        ],
#        [0.5       , 1.        ]],
#
#       [[0.33333333, 1.        ],
#        [0.33333333, 0.        ],
#        [0.5       , 1.        ],
#        [0.16666667, 1.        ]],


# In[6]:


# 라벨값에 대한 one-hot 인코딩 수행
# [8] -> [0,0,0,0,0,0,0,0,1,0,0,0]
# [1] -> [0,1,0,0,0,0,0,0,0,0,0,0]
# 최대값은 12이므로 출력되는 배열의 개수가 12개임
y_train = np_utils.to_categorical(y_train)
# array([[0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
#       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],


# In[7]:


one_hot_vec_size = y_train.shape[1]
#print("one hot encoding vector size is ", one_hot_vec_size)
# numpy 에서 행이 2이고 열이 3인 2차원 배열에서 rank는 2 이고, shape는 (2, 3)


# In[8]:


# 3. 모델 및 가중치 로드하기
model = keras.models.load_model(model_path)
model.summary()

loss, acc = model.evaluate(x_train, y_train, batch_size=1)
print("복원된 모델의 정확도: {:5.2f}%".format(100*acc))


# In[9]:


# 8. 모델 사용하기

pred_count = 50 # 최대 예측 개수 정의

# 한 스텝 예측

seq_out = ['g8', 'e8', 'e4', 'f8']
pred_out = model.predict(x_train, batch_size=1)

for i in range(pred_count):
    idx = np.argmax(pred_out[i]) # one-hot 인코딩을 인덱스 값으로 변환
    seq_out.append(idx2code[idx]) # seq_out는 최종 악보이므로 인덱스 값을 코드로 변환하여 저장
    
print("one step prediction : ", seq_out)

model.reset_states()

# 곡 전체 예측

seq_in = ['g8', 'e8', 'e4', 'f8']
seq_out = seq_in

seq_in_featrues = []

for si in seq_in:
    features = code2features(si)
    seq_in_featrues.append(features)

for i in range(pred_count):
    sample_in = np.array(seq_in_featrues)
    sample_in = np.reshape(sample_in, (1, 4, 2)) # 샘플 수, 타입스텝 수, 속성 수
    pred_out = model.predict(sample_in)
    idx = np.argmax(pred_out)
    seq_out.append(idx2code[idx])
    
    features = code2features(idx2code[idx])
    seq_in_featrues.append(features)
    seq_in_featrues.pop(0)

model.reset_states()
    
print("full song prediction : ", seq_out)

RSS ATOM XHTML 5 CSS3