Пакетная нормализация для некоторых входов только в керасе
У меня есть сеть 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