входные размеры одномерной сверточной сети в keras

действительно трудно понять входные размеры свертки 1d пласт в водоснабжении:

ввод формы

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

выходной формы

3D тензор с формой: (образцы, 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 общее смещение). Затем я хочу использовать max pooling и передать это в скрытый слой из 40 или около того нейронов, а затем вывести это с 4 нейронами с softmax во внешнем слое.

изображение (это довольно ужасно жаль!)

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

(minibatch_size, 101)

и выведите 3D-тензор размеров

(minibatch_size, 91, no_of_featuremaps)

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

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

Update: после очень полезных предложений я попытался сделать сверточную сеть так:

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)))

to

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

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

1 ответов


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

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

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