Подтвердить что ты не робот

Входные размеры в одномерную сверточную сеть в керасе

действительно трудно понять входные размеры сверточного 1d layer в keras:

Форма ввода

3D-тензор с формой: (образцы, шаги, input_dim).

Форма вывода

3D-тензор с формой: (samples, new_steps, nb_filter). значение шагов может измениться из-за заполнения.

Я хочу, чтобы моя сеть занимала временные ряды цен (101, в порядке) и выводила 4 вероятности. Моя текущая ненасыщенная сеть, которая делает это достаточно хорошо (с набором для тренировки 28000), выглядит следующим образом:

standardModel = Sequential()
standardModel.add(Dense(input_dim=101, output_dim=100, W_regularizer=l2(0.5), activation='sigmoid'))
standardModel.add(Dense(4, W_regularizer=l2(0.7), activation='softmax'))

Чтобы улучшить это, я хочу создать карту признаков из входного слоя, который имеет локальное восприимчивое поле длиной 10. (и, следовательно, имеет 10 общих весов и 1 общий смещение). Затем я хочу использовать максимальное объединение и подавать это на скрытый слой из 40 нейронов, а затем выводить его с помощью 4 нейронов с softmax во внешнем слое.

картинка (это ужасно жаль!) ​​

В идеале сверточный слой примет 2d-тензор размеров:

(minibatch_size, 101)

и вывести 3d-тензор размеров

(minibatch_size, 91, no_of_featuremaps)

Однако, слой keras, кажется, требует измерения на входе, называемом step. Я пробовал понять это и все еще не совсем понял. В моем случае должен быть шаг 1, так как каждый шаг в векторе - это увеличение времени на 1? Кроме того, что такое new_step?

Кроме того, как вы можете вывести выход слоев объединения (3d-тензор) на вход, подходящий для стандартного скрытого слоя (т.е. слой Dense keras) в виде 2d-тензора?

Обновление: после очень полезных предложений я попытался сделать сверточную сеть следующим образом:

conv = Sequential()
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
conv.add(Activation('relu'))
conv.add(MaxPooling1D(2))
conv.add(Flatten())
conv.add(Dense(10))
conv.add(Activation('tanh'))
conv.add(Dense(4))
conv.add(Activation('softmax'))

Строка conv.Add(Flatten()) выдает диапазон, превышающий допустимую ошибку границ. Интересно, что эта ошибка не указана не для этого кода:

conv = Sequential()
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
conv.add(Activation('relu'))
conv.add(MaxPooling1D(2))
conv.add(Flatten())

делать

print conv.input_shape
print conv.output_shape

приводит к

(None, 1, 101
(None, -256)

Обновление 2:

Изменено

conv.add(Convolution1D(64, 10, input_shape=(1,101)))

к

conv.add(Convolution1D(10, 10, input_shape=(101,1))

и он начал работать. Однако существует ли какая-либо важная разница между вводя (None, 101, 1) в слой 1d conv или (None, 1, 101), о котором я должен знать? Почему (None, 1, 101) не работает?

4b9b3361

Ответ 1

Причина, по которой это выглядит, заключается в том, что дизайнер Keras намеревался сделать одномерную сверточную структуру интерпретируемой как основу для обработки последовательностей. Чтобы полностью понять разницу - попробуйте представить, что у вас есть последовательность векторов с множеством признаков. Тогда ваш выход будет как минимум двухмерным - где первое измерение связано со временем, а другие измерения связаны с функциями. 1-мерная сверточная структура была сконструирована таким образом, чтобы в какой-то мере смещать это измерение времени и пытаться найти шаблоны повторного захвата в данных, а не выполнять классическое многомерное сверточное преобразование.

В вашем случае вы должны просто изменить свои данные на форму (dataset_size, 101, 1) - потому что у вас есть только одна функция. Это можно сделать легко с помощью функции numpy.reshape. Чтобы понять, что означает новый шаг, вы должны понимать, что со временем выполняете свертку, поэтому вы изменяете временную структуру своих данных, что приводит к новой структуре, связанной с временем. Чтобы получить ваши данные в формате, который подходит для плотных/статических слоев, используйте слой keras.layers.flatten - то же, что и в классическом сверточном случае.

ОБНОВЛЕНИЕ: Как я уже говорил, первое измерение ввода связано со временем. Таким образом, разница между (1, 101) и (101, 1) заключается в том, что в первом случае у вас есть один временной шаг с 101 функцией, а во втором - 101 timesteps с 1 функцией. Проблема, о которой вы говорили после первого изменения, имеет свое начало в создании пула с размером 2 на таком входе. Имея только один временной сигнал - вы не можете объединить любое значение во временном окне размера 2 - просто потому, что для этого недостаточно временных меток.