#tensorflow #keras #lstm #summarize
#tensorflow #keras #lstm #подведение итогов
Вопрос:
После перестановки слоя размеры становятся (None, None, 12, 16) Я хочу суммировать последние два измерения с помощью LSTM (48 единиц) с помощью input_shape (12, 16), чтобы общий размер стал (None, None, 48)
В настоящее время у меня есть обходной путь с пользовательским lstm amp; lstmcell, однако он очень медленный, поскольку я использовал другой LSTM внутри ячейки и т.д.
Что я хотел бы иметь, так это:
(None, None, 12, 16)
(None, None, 48)
(None, None, 60)
Последние два выполняются в пользовательском lstm (в настоящее время), есть ли способ их разделить?
Как правильно это сделать? Можем ли мы создать разные (или несколько) lstm для ячеек, которые имеют одинаковые веса, но разные состояния ячеек? Не могли бы вы дать мне какое-нибудь направление?
входные данные (InputLayer) (Нет, 36, Нет, 1) 0
convlayer (Conv2D) (Нет, 36, Нет, 16) 160 входов [0] [0]
mp (MaxPooling2D) (None, 12, None, 16) 0 convlayer[0][0]
permute_1 (Перестановка) (Нет, Нет, 12, 16) 0 mp[0][0]
reshape_1 (Изменить форму) (Нет, Нет, 192) 0 permute_1[0][0]
custom_lstm_extended_1 (CustomL (None, None, 60) 26160 reshape_1[0][0]
Пользовательский LSTM вызывается следующим образом: CustomLSTMExtended(units= 60, summarizeUnits= 48, return_sequences=True, return_state=False, input_shape=(None, 192))(внутренний)
LSTM class:
self.summarizeUnits = summarizeUnits
self.summarizeLSTM = CuDNNLSTM(summarizeUnits, input_shape=(None, 16), return_sequences=False, return_state=True)
cell = SummarizeLSTMCellExtended(self.summarizeLSTM, units,
activation=activation,
recurrent_activation=recurrent_activation,
use_bias=use_bias,
kernel_initializer=kernel_initializer,
recurrent_initializer=recurrent_initializer,
unit_forget_bias=unit_forget_bias,
bias_initializer=bias_initializer,
kernel_regularizer=kernel_regularizer,
recurrent_regularizer=recurrent_regularizer,
bias_regularizer=bias_regularizer,
kernel_constraint=kernel_constraint,
recurrent_constraint=recurrent_constraint,
bias_constraint=bias_constraint,
dropout=dropout,
recurrent_dropout=recurrent_dropout,
implementation=implementation)
RNN.__init__(self, cell,
return_sequences=return_sequences,
return_state=return_state,
go_backwards=go_backwards,
stateful=stateful,
unroll=unroll,
**kwargs)
Cell class:
def call(self, inputs, states, training=None):
#cell
reshaped = Reshape([12, 16])(inputs)
state_h = self.summarizeLayer(reshaped)
inputsx = state_h[0]
return super(SummarizeLSTMCellExtended, self).call(inputsx, states, training)
Ответ №1:
Я сделал это с помощью tf.reshape, а не keras Reshape layer. Keras reshape layer не хочет, чтобы вы вмешивались в измерение «batch_size»
shape = Lambda(lambda x: tf.shape(x), output_shape=(4,))(inner)
..
..
inner = Lambda(lambda x : customreshape(x), output_shape=(None, 48))([inner, shape])
..
def customreshape(inputs):
inner = inputs[0]
shape = inputs[1]
import tensorflow as tf2
reshaped = tf2.reshape(inner, [shape[0], shape[1], 48] )
return reshaped