Version 1 (modified by 6 years ago) ( diff ) | ,
---|
5.4. Имплементација
Системот за автоматско генерериње на македонска народна мелодија наречен MacedonMelody се состои од две python скрипти. Првата скрипта се користи за креирање и тренирање на моделот врз базата на податоци, додека во втората се генерира македонска народна мелодија врз база на тренираниот модел.
Скрипта 1 – macedon_melody_train.py
import glob # За да можеме да пристапиме локално во системот import pickle # За да ги зачуваме нотите во документ import numpy # За менување на формата на влезот на невронската мрежа from keras.models import Sequential from keras.layers import CuDNNLSTM from keras.layers import Dropout from keras.layers import Dense from keras.layers import Activation from keras.utils import np_utils from keras.callbacks import ModelCheckpoint from music21 import converter, instrument, note, chord, stream
def mac_notes(): # Функција за креирање вокабулар од ноти од сите муз. документи во базата на податоци за тренирање
macedonian_notes = [] # Листа за зачувување на сите ноти од МИДИ документите for file in glob.glob("mac_midi/*.mid"):
macedonian_midi = converter.parse(file) #Парсирање на нотен запис од фајл print("The song parsed is: %s " %file) # macedonian_midi.show('text') – За прикажување на содржините на миди документите
mac_notes_to_be_parsed = None offsets = None try:
mac_notes_to_be_parsed = macedonian_midi.flat.notes
except:
mac_instruments = instrument.partitionByInstrument(macedonian_midi) mac_notes_to_be_parsed = mac_instruments.parts[0].recurse()
for element in mac_notes_to_be_parsed:
if isinstance(element, note.Note):
macedonian_notes.append(str(element.pitch))
elif isinstance(element, chord.Chord):
macedonian_notes.append('.'.join(str(m) for m in element.normalOrder))
with open('data/macedonian_notes','wb') as filepath:
pickle.dump(macedonian_notes, filepath)
return macedonian_notes # На излез дава листа со ноти
def io_neural_sequences(macedonian_notes,mac_notes_vocabulary): # Функција за дефинирање на влезната и излезната секвенца на моделот на невронската мрежа.
input_sequence = None output_sequence = None sequence_size = 150 n_patterns = 0 pitch_names = sorted(set(elem for elem in macedonian_notes)) mac_notes_to_int = dict((note, number) for number, note in enumerate(pitch_names)) i_neural_sequence = [] o_neural_sequence = [] for m in range(0, len(macedonian_notes)-sequence_size,1):
input_sequence = macedonian_notes[m:m + sequence_size] output_sequence = macedonian_notes[m + sequence_size] i_neural_sequence.append([mac_notes_to_int[char] for char in input_sequence]) o_neural_sequence.append(mac_notes_to_int[output_sequence])
n_patterns = len(i_neural_sequence) i_neural_sequence = numpy.reshape(i_neural_sequence, (n_patterns,sequence_size,1)) i_neural_sequence = i_neural_sequence / float(mac_notes_vocabulary) o_neural_sequence = np_utils.to_categorical(o_neural_sequence)
return (i_neural_sequence, o_neural_sequence) # На излез ни ги дава дефинираните внезна и излезна секвенца за невронската мрежа
def model_neural_netrowk(i_neural_sequence, mac_notes_vocabulary): # Функција за креирање на артитектура на секвенционен модел на невронска мрежа, кој се состои од 3 CuDNNLSTM слоја, 3 Dropout слоја, 2 Dense слоја и слој за активација.
model = Sequential() model.add(CuDNNLSTM(256,input_shape=(i_neural_sequence.shape[1], i_neural_sequence.shape[2]),return_sequences=True)) model.add(Dropout(0.3)) model.add(CuDNNLSTM(512, return_sequences=True)) model.add(Dropout(0.3)) model.add(CuDNNLSTM(256)) model.add(Dropout(0.3)) model.add(Dense(256)) model.add(Dense(mac_notes_vocabulary)) model.add(Activation('softmax')) model.compile(loss='categorical_crossentropy', optimizer='rmsprop') return model # На излез дава моделиран модел на LSTM невронска мрежа
def train_neural_network(model, i_neural_sequence, o_neural_sequence): # Функција за тренирање на невронската мрежа
filepath = "weights-{epoch:02d}-{loss:.4f}-bigger.hdf5" checkpoint = ModelCheckpoint(
filepath, monitor='loss', verbose=0, save_best_only=True, mode='min'
)
callbacks_list = [checkpoint]
model.fit(i_neural_sequence, o_neural_sequence, epochs=50, batch_size=10, callbacks=callbacks_list)
if name == 'main':
macedonian_notes = mac_notes() # Ја повикуваме функцијата за креирање вокабулар од мак. ноти mac_notes_vocabulary = len(set(macedonian_notes)) mac_notes_vocabulary2 = len(macedonian_notes) print("Num vocab is: %s " % mac_notes_vocabulary) print("Size is: %s " % mac_notes_vocabulary2) i_neural_sequence, o_neural_sequence = io_neural_sequences(macedonian_notes,mac_notes_vocabulary) # Ја повикуваме функцијата која ни ги дава влезната и излезната секвенца за н. мрежа model = model_neural_netrowk(i_neural_sequence, mac_notes_vocabulary) # Ja повикуваме функцијата за креирање на моделот train_neural_network(model, i_neural_sequence, o_neural_sequence) # Ја повикуваме функцијата за тренирање на модел на невронска мрежа