Визуализация промежуточных слоев в пользовательской модели из керас - PullRequest
0 голосов
/ 17 октября 2018

В настоящее время я использую модель ConvLSTM из официального репозитория Keras.Одной из наиболее сложных частей понимания модели является сложность понимания того, что происходит на каждом этапе процесса.Официальный код можно найти здесь .Глядя на модель последовательности, множественные вхождения уровней пакетной нормы и сверточного LSTM не являются очевидным выбором, и довольно сложно понять, что они на самом деле делают.

seq = Sequential()
seq.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
               input_shape=(None, 40, 40, 1),
               padding='same', return_sequences=True))
seq.add(BatchNormalization())

seq.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
               padding='same', return_sequences=True))
seq.add(BatchNormalization())

seq.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
               padding='same', return_sequences=True))
seq.add(BatchNormalization())

seq.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
               padding='same', return_sequences=True))
seq.add(BatchNormalization())

Мрачное понимание того же - это то, что оно помогает извлечь особенности кадра, используя полезность сверток, когда дело доходит до изображений.Входные данные - это кадры видео.Было бы очень полезно, если бы я мог визуализировать выходные данные каждого слоя, это может помочь мне лучше понять, чему способствуют слои сверточного LSTM на каждом этапе.Любые предложения о том, как идти об этом или указатели в этом направлении приветствуются.Спасибо за ваше время.

1 Ответ

0 голосов
/ 17 октября 2018

Если вы знакомы только с построением графа стиля Keras, я рекомендую вам создать еще один Sequential, который разделяет некоторые слои с origianl Sequential, например

seq = tf.keras.Sequential()
d1 = layers.Dense(units=1, use_bias=False, 
                  kernel_initializer=tf.initializers.constant(2.0))
d2 = layers.Dense(units=1, use_bias=False, 
                  kernel_initializer=tf.initializers.constant(3.0))
seq.add(d1)
seq.add(d2)

seq2 = tf.keras.Sequential()
seq2.add(d1)

print (seq.predict(np.ones(shape=[1,1])))
print (seq2.predict(np.ones(shape=[1,1])))

В приведенном выше случае вы можете получить значениепромежуточный слой d1.

Если вы часто используете raw tf.Session (), вы можете настроить метод call () для вашей модели

class MultiOut(tf.keras.Model):
    def __init__(self, name="original"):
        super().__init__(name=name)
        self.d1 = layers.Dense(units=1, use_bias=False, 
                               kernel_initializer=tf.initializers.constant(2.0))
        self.d2 = layers.Dense(units=1, use_bias=False, 
                               kernel_initializer=tf.initializers.constant(3.0))

    def call(self, inputs, multiout=False):
        d1 = self.d1(inputs)
        d2 = self.d2(d1)

        if not multiout:
            return d2
        else:
            return d1, d2

model = MultiOut()

input = np.ones(shape=[1,1])
print (model.predict(input))

sess = tf.keras.backend.get_session()
ts_input = tf.constant(input, dtype=tf.float32)

print (sess.run(model(ts_input, multiout=True)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...