我用 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 一样获取每一层的输出,我该怎么做?
原文由 GoingMyWay 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用以下方法轻松获得任何层的输出:
model.layers[index].output
对于所有层使用这个:
注意:要模拟辍学使用
learning_phase
1.
layer_outs
0.
编辑:( 基于评论)
K.function
创建 theano/tensorflow 张量函数,稍后用于在给定输入的情况下从符号图中获取输出。现在
K.learning_phase()
需要作为输入,因为像 Dropout/Batchnomalization 这样的许多 Keras 层都依赖它来改变训练和测试期间的行为。因此,如果您删除代码中的 dropout 层,您可以简单地使用:
编辑 2:更优化
我刚刚意识到之前的答案并没有针对每个函数评估进行优化,数据将被传输到 CPU->GPU 内存,而且张量计算需要对下层进行 over-n-over。
相反,这是一种更好的方法,因为您不需要多个函数,而是一个函数即可为您提供所有输出的列表: