我想训练一个 CNN 来使用 Keras 从 100x100x1 图像中预测 224x224x13 矩阵(热图)。我的想法是微调 keras 提供的预训练网络(resnet、Xception、vgg16 等)。

第一步是用预训练的顶层替换满足我的问题约束的顶层。我正在尝试预测值范围从 0 到 1 的 100x100x1 热图图像。因此我希望我的网络的输出是一个 100x100x1 矩阵。我相信,如果我使用 Flatten 然后使用 Dense1000x1x1 层,我将丢失我不想要的空间信息(对吧?)。

我希望我的代码灵活,能够独立于正在使用的预训练架构运行(我必须运行许多实验)。因此,我想堆叠一个 Dense 层,该层连接到它之前的任何类型层的每个单元(这将取决于我将使用的预训练架构)。

一些答案与完全卷积方法有关,但这不是我在这里的意思。我的 XY 都有固定的形状(分别是 224x224x3100x100x1)。

我的问题是我现在不知道如何以网络的预测/输出是 100x100x1 矩阵的方式堆叠新层。
正如答案中所建议的那样,我正在尝试添加 100x100x1 Dense 层。但我似乎没有得到它的工作:
例如,如果我喜欢这个:

x = self.base_model.output
predictions = keras.layers.Dense(input_shape = (None, 100,100), units= 1000, activation='linear')(x)
self.model = keras.models.Model(input=self.base_model.input, output=predictions)

然后当我开始训练时我得到了这个:
ValueError: Error when checking target: expected dense_1 to have 4 dimensions, but got array with shape (64, 100, 100)
网络的Y确实是批量的形状(64,100,100)有什么建议么?

另外,我应该使用哪个损失函数?正如答案中所建议的那样,我可以使用 mse 但我想知道,是否有任何损失函数能够测量我想要的 100x100x1 输出的空间信息?

提前致谢。

编辑:

由于@ncasas 的回答,我 半解决了 我的问题:

我只是添加了一些反卷积层,直到得到类似于 100x100x1 的输出。这不是我首先想要的,因为此实现与构建在其之上的预训练架构无关。对于带有 Xceptioninput_shape = (224, 224, 3) ,顶层给出 80x80x1 的输出:
x = self.base_model.output
x = keras.layers.Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = keras.layers.UpSampling2D((3, 3))(x)
x = keras.layers.Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = keras.layers.UpSampling2D((2, 2))(x)
x = keras.layers.Conv2D(16, (3, 3), activation='relu')(x)
x = keras.layers.UpSampling2D((2, 2))(x)
predictions = keras.layers.Conv2D(filters = 1,
                                 kernel_size = (3, 3),
                                 activation='sigmoid',
                                 padding='same')(x)
self.model = keras.models.Model(input=self.base_model.input, output=predictions)

其中 self.base_modelkeras.applications.Xception(weights = 'imagenet', include_top = False, input_shape = (224, 224, 3))
我终于使用 mse 作为损失函数,它工作得很好。

最佳答案

您所描述的是多维线性回归加迁移学习。

为了重用经过训练的 Keras 模型的第一层,您可以关注 Keras 博客中的 this post,在“使用预训练网络的瓶颈特征:一分钟内达到 90% 的准确率”部分。对于您的情况,唯一的区别是:

  • 对于最后一层之前的层,您可能应该有大于 256 的值。
  • 最后一层将是一个 10000 单位的密集层,具有线性激活(即根本没有激活)。您可以将预期输出从 100x100 重塑为 100000,或者向网络添加额外的重塑层以获得 100x100 的输出。

  • 请记住,在网络的卷积部分和多层感知器部分(即最终的 Dense 层)之间必须有一个 Flatten 层来将获得的激活模式放置在单个矩阵中(在链接的帖子中搜索“Flatten ");您收到的错误就是因为这个。

    如果您不想展平激活模式,您可能希望在最后一层直接使用 deconvolutions。为此,您可以在“卷积自动编码器”部分查看 keras autoencoder tutorial

    用于回归问题的常用损失函数是均方误差 (MSE)。正如 here 所解释的那样,使用交叉熵进行回归是没有意义的。

    关于neural-network - 使用保留空间信息的 keras 从图像中预测 2D 矩阵,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44477410/

    10-12 23:51