Пакетная нормализация для некоторых входов только в керасе

У меня есть сеть LSTM, которая имеет 5 входов. Типичные значения 1-го входа - от 1000 до 3000. Остальные входы имеют значения от -1 до 1.

Я хотел бы вставить BatchNormalization в качестве 1-го слоя. Но входы 2-5 уже находятся между -1 и 1, и 1-й вход намного больше, чем 1-й вход. Вот я и хотел бы применить пакетную нормализацию только для 1-го входа и оставить входы 2-5 как есть. Затем 1-й (нормализованный) вход и 2-5 входов должны быть переданы на уровень LSTM.

      +----+   +---+
 1 -->| BN |-->|   |
      +----+   | L |
 2 ----------->| S |
 3 ----------->| T |
 4 ----------->| M | 
 5 ----------->|   |
               +---+

Как это можно сделать в Керасе?

Я думаю, что я могу создать модель с голым слоем BatchNormalization для 1-го ввода, а затем объединить ее с остальными слоями. Но я не уверен и не знаю, как именно это сделать.

2 ответа

Решение

Попробуйте следующее определение:

from keras.layers.merge import concatenate

input_tensor = Input(shape=(timesteps, 5)) 

# now let's split tensors
split_1 = Lambda(lambda x: x[:, :, :1])(input_tensor)
split_2 = Lambda(lambda x: x[:, :, 1:])(input_tensor)

split_1 = BatchNormalization()(split_1)

# now let's concatenate them again
follow = concatenate([split_1, split_2])

Но, как отметил Дэниел в своем комментарии, лучше нормализовать данные, чтобы справиться с такими несоответствиями, используя BatchNormalization может привести к снижению производительности.

Учитывая, что у вас есть тренировочные данные в форме (batch,timeSteps,5), может быть, вы должны просто изменить свой ввод следующим образом:

maxVal = abs(X_train[:,:,0].max())
minVal = abs(X_train[:,:,0].min())
maxVal = max(maxVal,minVal)

X_train[:,:,0] = X_train[:,:,0] / maxVal
Другие вопросы по тегам