【问题标题】:Keras getting output of intermidate layersKeras 获取中间层的输出
【发布时间】:2017-03-21 05:57:46
【问题描述】:
## what my model looks like

# defining the model archictecture
model = Sequential()
# 1st conv layer
model.add(Conv2D(32, (5, 5), activation='relu', input_shape=x_ip_shape))
# 1st max pool
model.add(MaxPooling2D(pool_size=(2, 2)))
# 2nd conv layer
model.add(Conv2D(64, (7, 7), activation='relu'))
# 2nd max pool
model.add(MaxPooling2D(pool_size=(2, 2)))
# Flattenning the input
model.add(Flatten())
# 1st Fully connected layer
model.add(Dense(10, activation='relu'))
# Adding droput
model.add(Dropout(0.25))
# softmax layer
model.add(Dense(classes_out, activation='softmax'))

# defining loss, optimizer learning rate and metric
model.compile(loss='categorical_crossentropy',optimizer=keras.optimizers.Adam(1e-4), metrics=['accuracy'])


## prediction
scores = model.evaluate(test_x, test_labels, verbose=0)

问题: 相反,我可以获得# 1st 全连接层的前向传递输出,即model.add(Dense(10, activation='relu'))?

我在 keras FAQ 上查看了示例。但这让我很困惑: 在此:

get_3rd_layer_output = K.function([model.layers[0].input, K.learning_phase()], [model.layers[3].output])

我在哪里传递输入数据? model.layers[0].input 是什么意思?受过训练的模型是否存储输入?

【问题讨论】:

    标签: tensorflow neural-network keras conv-neural-network


    【解决方案1】:

    get_3rd_layer_output 是 Theano 函数。您不需要对其进行很多修改。

    model.layers[0].input 将保持原样,如果您想要网络中第一层的输入(任何层)的输出。换句话说,如果您希望将第 4 层的某个层的输出作为输入,那么您应该将其更改为 model.layers[4].input。

    K.learning_phase() 表示您希望输出是在训练阶段还是在测试阶段。这两者的输出之间会有一些差异,因为存在诸如Dropout 之类的层在训练和测试期间的行为不同。如果您想要类似于predict() 的输出,则需要传递零。

    model.layers[3].output:这是您需要进行修改的地方。找出要从中输出的图层的索引。如果您有 IDE(例如 Pycharm),然后单击 model 变量并查看层的索引(记住它从零开始)。如果没有,请为该层指定一些名称,然后您可以通过model.layers 找到所有层名称。由此,您可以轻松获取索引。例如,如果您想从第 10 层输出,则可以将其更改为 model.layers[10].output。

    这个怎么称呼?

    这又是一个 Theano 函数,所以是一个符号函数。您必须传递值并对其进行评估。你可以这样做:

    out = get_3rd_layer_output([X, 0])[0]  # test mode
    

    记住,即使X 是单个数据点,它的形状也应该是(1,) + x_ip_shape。

    【讨论】:

    • 这里K.learning_phase()的作用我不太明白。理论上,在训练中,我们将一些隐藏输出以给定的概率设置为 0。并且,在测试中,我们接受期望。 1.如果我想得到一个中间层的输出,是不是总是在测试时? 2.说,我已经训练了模型。现在,我想检查一些火车样本的中间输出。在这种情况下,我会使用测试模式,对吧?
    • 你会使用测试模式,但我认为他们已经提供了功能。如果您的训练没有按预期进行,那么您会希望在训练阶段看到中间输出吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多