У меня проблема со способом создания моих данных для NN со слоем LSTM. У меня много файлов , содержащих сотни строк. Каждый файл представляет собой песню , а каждая строка представляет собой ноту с 4 значениями . Я хочу, чтобы NN читал заметки с последовательностью из 10 заметок , чтобы он мог предсказать следующую заметку из них. При необходимости мы можем зафиксировать количество нот на уровне 5000 на песню.

Поэтому я просто хочу знать, какую форму должны иметь мои входные и выходные данные и как определить первый слой LSTM.

model = Sequential()
model.add(LSTM(32, input_shape=(5000, 4),return_sequences=True))

В поддон до:

  • Один файл имеет 5000 строк и 4 столбца и представляет 1 песню.

  • Одна строка в файле представляет одну заметку с 4 значениями.

Спасибо за помощь.

3
Juan 31 Дек 2017 в 11:14

2 ответа

Лучший ответ

Форма ввода первого слоя LSTM должна быть (None, 10, 4). Форма вывода модели будет (None, 4). Я использую None для размера партии.

В качестве примера я написал простой LSTM:

import numpy as np
from keras.layers import LSTM
from keras.models import Sequential

batch_size = 32
window_length = 10
note_dim = 4
n_samples = 5000

# Input data. TODO: Slide window and modify it to use real data
x = np.ones(shape=(n_samples, window_length, note_dim))
y = np.ones(shape=(n_samples, note_dim))

# Define model
model = Sequential()
model.add(LSTM(note_dim, input_shape=(window_length, note_dim))) # The batch dimension is implicit here

model.compile('sgd', 'mse')
model.fit(x=x, # Batch input shape is: (None, window_length, note_dim)
          y=y, # Batch output shape is: (None, note_dim)
          batch_size=batch_size)

Если вам нужна более сложная модель (например, 2 слоя LSTM), вы можете определить ее следующим образом:

# ...
# Define model
hidden_size = 50
model = Sequential()
model.add(LSTM(hidden_size, input_shape=(window_length, note_dim), return_sequences=True)) # The batch dimension is implicit here
model.add(LSTM(note_dim))
# ...

ОБНОВЛЕНИЕ: ответьте на свой первый комментарий.

x должен содержать все песни после перемещения по ним окна. Например, предположим, что у вас есть переменная songs с формой (n_songs, notes_per_song, note_dim), содержащая все ваши песни. Затем вы можете создать x и y следующим образом:

# ...
# Input data    
# Suppose that variable ´songs´ is an array with shape: (n_songs, notes_per_song, note_dim). 
samples_per_song = notes_per_song-window_length
n_samples = n_songs*samples_per_song
x = np.zeros(shape=(n_samples, window_length, note_dim))
y = np.zeros(shape=(n_samples, note_dim))
for n, song in enumerate(songs):
    for i in range(samples_per_song):
        x[i+n*samples_per_song, :, :] = song[i:(i+window_length), :]
        y[i+n*samples_per_song, :, :] = song[i+window_length, :] # note that you want to predict
# ...
1
rvinas 1 Янв 2018 в 10:26

Я хочу, чтобы NN читал заметки с последовательностью из 10 заметок, чтобы он мог предсказать по ним следующую заметку.

Я никогда не использовал керасы, но думаю, вам следует сначала преобразовать эти заметки в идентификаторы. Например: (aa, bb, cc, dd) как 1 и (ab, bb, cc, dd) как 2 и т. Д.

Затем вы читаете 10 идентификаторов / заметок для кодировщика и затем добавляете проекцию для проецирования конечного состояния на 11-ю заметку. И если вы хотите протестировать модель с 10 нотами из любой ноты в песне, вы затем тренируете вторую до 11-й и ставите 12-ю в качестве цели после проецирования. И так далее и так далее, пока последняя нота не станет целью. Это для одной песни и повторить это для всех песен.

Вы можете получить обратно заметки через идентификаторы. Вы можете создать словарный запас, чтобы передавать его туда и обратно.

0
Lerner Zhang 31 Дек 2017 в 18:35