我用CNN训练了一个二进制分类模型,这是我的代码
model = Sequential()
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1],
border_mode='valid',
input_shape=input_shape))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=pool_size))
# (16, 16, 32)
model.add(Convolution2D(nb_filters*2, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters*2, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=pool_size))
# (8, 8, 64) = (2048)
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(2)) # define a binary classification problem
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='adadelta',
metrics=['accuracy'])
model.fit(x_train, y_train,
batch_size=batch_size,
nb_epoch=nb_epoch,
verbose=1,
validation_data=(x_test, y_test))
在这里,我想得到每一层的输出,就像TensorFlow,我怎么做?
您可以使用:
model.layers[index].output
轻松获得任何层的输出对于所有层,请使用:
注:若要模拟退出,请在
layer_outs
中使用learning_phase
作为1.
,否则使用0.
编辑:(基于评论)
K.function
创建no/tensorflow张量函数,该函数稍后用于从给定输入的符号图中获取输出。现在
K.learning_phase()
是必需的输入,因为许多像Dropout/Batchnomalization这样的Keras层依赖它来改变训练和测试期间的行为。因此,如果删除代码中的退出层,您可以简单地使用:
编辑2:更优化
我刚刚意识到,前面的答案并不是对每个函数的计算都进行优化,数据将被传输到CPU->;GPU内存中,而且张量计算需要在n-over上为较低层进行。
相反,这是一种更好的方法,因为您不需要多个函数,而只需要一个函数即可列出所有输出:
基于这个线程的所有正确答案,我编写了一个库来获取每个层的输出。它抽象了所有的复杂性,并且设计得尽可能友好:
https://github.com/philipperemy/keract
它能处理几乎所有的边缘案件
希望有帮助!
来自https://keras.io/getting-started/faq/#how-can-i-obtain-the-output-of-an-intermediate-layer
一个简单的方法是创建一个新模型,该模型将输出您感兴趣的图层:
或者,您可以构建一个Keras函数,该函数将返回给定特定输入的特定层的输出,例如:
相关问题 更多 >
编程相关推荐