【发布时间】:2017-11-01 21:25:50
【问题描述】:
我想用 Keras 编写一个神经网络,它既可以用作自动编码器,也可以用作半监督学习的分类器。以这个数据集为例,其中有少量标记图像和大量未标记图像:https://cs.stanford.edu/~acoates/stl10/
here 列出的一些论文成功地实现了这一点,或者非常相似的事情。
总结一下:如果模型具有相同的输入数据形状和相同的“编码”卷积层,但会分成两个头(叉式),那么就有一个分类头和一个解码头,在无监督自动编码器将有助于分类头的良好学习的一种方式。
使用 TensorFlow,这样做不会有任何问题,因为我们可以完全控制计算图。
但是对于 Keras,事情更高级,我觉得所有对“.fit”的调用必须始终同时提供所有数据(所以它会迫使我将分类头和自动编码头捆绑在一起一个时间步长)。
在 keras 中几乎可以做到这一点的一种方法是使用这样的东西:
input = Input(shape=(32, 32, 3))
cnn_feature_map = sequential_cnn_trunk(input)
classification_predictions = Dense(10, activation='sigmoid')(cnn_feature_map)
autoencoded_predictions = decode_cnn_head_sequential(cnn_feature_map)
model = Model(inputs=[input], outputs=[classification_predictions, ])
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
model.fit([images], [labels, images], epochs=10)
但是,我认为并且我担心如果我只是想以这种方式安装东西,它会失败并要求丢失的头部:
for epoch in range(10):
# classifications step
model.fit([images], [labels, None], epochs=1)
# "semi-unsupervised" autoencoding step
model.fit([images], [None, images], epochs=1)
# note: ".train_on_batch" could probably be used rather than ".fit" to avoid doing a whole epoch each time.
应该如何使用 Keras 实现这一行为?是否可以联合进行训练而不必将两个调用拆分为“.fit”函数?
【问题讨论】:
标签: machine-learning computer-vision deep-learning keras unsupervised-learning