从 keras 可视化自定义模型中的中间层



我目前正在从官方的Keras存储库运行ConvLSTM模型。理解模型的一个更困难的部分是难以设想过程的每个阶段正在发生的事情。官方代码可以在这里找到。 查看序列模型,批量范数和卷积 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层在每个阶段的贡献。任何关于如何去做的建议或朝这个方向的指示,不胜感激。谢谢你的时间。

如果您只熟悉 Keras 风格的图形构造,我建议您制作另一个与原始顺序共享一些层的顺序,例如

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的值。

如果您经常使用原始 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)))

最新更新