Работа с размером партии и шагом по времени в 1D CNN - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть пакетный генератор, который дает мне данные в форме (500, 1, 12) (то есть соответствует (batch size, time steps, features)).

def batch_generator(batch_size, gen_x,gen_y): 
    batch_features = np.zeros((batch_size,1, 12))
    batch_labels = np.zeros((batch_size,9))
    while True:
        for i in range(batch_size):
            batch_features[i] = next(gen_x)
            batch_labels[i] = next(gen_y)
        yield batch_features, batch_labels

def generate_X():
    while True:
        with open("/my_path/my_data.csv") as f:
            for line in f:
                currentline = line.rstrip('\n').split(",")
                currentline = np.asarray(currentline)
                currentline = currentline.reshape(1,1,12)
                yield currentline

def generate_y():
    while True:
        for i in range(len(y_train)):
            y= y_train[i]
            yield y

Затем я пытаюсь передать это в 1D-CNN:

model = Sequential()
model.add(Conv1D(filters=100, kernel_size=1, activation='relu', input_shape=(1,12), data_format="channels_last"))

Но теперь я не могу использовать размер ядра больше 1 (т.е. kernel_size = 1). Вероятно, это потому, что мой временной шаг равен 1.

Как я могу использовать весь размер пакета в качестве входных данных для 1D-CNN и увеличить kernel_size?

1 Ответ

1 голос
/ 14 апреля 2020

Имейте в виду, что 1D-свертка используется, когда каждая из наших входных выборок представляет собой последовательность, то есть данные, в которых важен / задан порядок значений, например, значения фондового рынка за неделю или значения температуры погоды за период месяца или последовательность геномов или слов. С учетом вышесказанного, учитывая ваши данные, есть три различных сценария ios:

  • Если каждая строка в вашем CSV-файле представляет собой последовательность длиной 12, то вы имеете дело с образцами shape (12,1), т.е. в каждом образце есть 12 временных шагов, где каждый временной шаг имеет только функцию. Таким образом, вы должны изменить его соответственно (т.е. (12,1), а не (1,12)).

  • Однако, если каждая строка не является последовательностью, а группой последовательных строк Если вы формируете последовательность, то вы должны сгенерировать свои данные соответствующим образом: каждая выборка будет состоять из нескольких последовательных строк, например, если мы считаем число временных шагов равным 10, тогда строки с 1 по 10 будут выборкой, строки с 2 по 12 будет еще один образец и так далее. И в этом случае каждый образец будет иметь форму (number_of_timesteps, 12) (в упомянутом выше примере это будет (10,12)). Теперь вы можете создавать и генерировать эти образцы, написав пользовательскую функцию, или же вы можете загрузить все данные в виде массива numpy и затем использовать TimeseriesGenerator, чтобы сделать это за вас.

  • Если ни один из двух приведенных выше случаев не применим, то весьма вероятно, что ваши данные вообще не являются последовательными и поэтому использование 1D-CNN (или любой другой модели обработки последовательностей, такой как RNN) не дает смысл для этих данных. Вместо этого вы должны использовать другие подходящие архитектуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...