как распараллелить пользовательский lstm (4d ввод) - PullRequest
0 голосов
/ 19 апреля 2019

После того, как слой перестановок, размеры становятся (Нет, Нет, 12, 16), я хочу суммировать последние два измерения с помощью LSTM (48 единиц) с input_shape (12, 16), чтобы общий размер стал (Нет, Нет, 48)

В настоящее время у меня есть обходной путь с пользовательским lstm & 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 (Permute)(Нет, Нет, 12, 16) 0 mp [0] [0]


reshape_1 (Reshape) (Нет, Нет, 192) 0 permute_1 [0] [0]


custom_lstm_extended_1 (CustomL (None, None, 60) 26160 reshape_1 [0] [0]

Custom LSTM вызывается так: CustomLSTMExtended (unit = 60, sumrizeUnits = 48, return_sequence = True, return_state)= Ложь, input_shape = (Нет, 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 Ответ

0 голосов
/ 25 апреля 2019

Я сделал это, используя tf.reshape, а не keras Reshape layer.Слой изменения формы Keras не хочет, чтобы вы вмешивались в измерение "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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...