使用keras保持空间信息来预测图像中的2D矩阵

时间:2017-06-09 15:53:00

标签: neural-network keras

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

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

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

有些答案与完全卷积方法有关,但这不是我的意思。我的Y224x224x3都有固定的形状(分别为100x100x1100x100x1)。

我的问题是我现在不知道如何以这样的方式堆叠新图层,即网络的预测/输出是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,但我想知道,是否有任何能够测量我所需100x100x1输出的空间信息的损失函数?

提前致谢。

编辑:

半解决我的问题归功于@ncasas的答案:

我刚刚添加了一些反卷积层,直到我得到类似于Xception的输出。这不是我想要的第一个地方,因为这个实现对于构建在其上的预训练架构并不是不可知的。对于input_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_model

其中keras.applications.Xception(weights = 'imagenet', include_top = False, input_shape = (224, 224, 3))mse

我最终使用Flatten作为损失函数,它运行得很好。

2 个答案:

答案 0 :(得分:2)

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

为了重用训练有素的Keras模型的第一层,您可以在Keras博客的“使用预训练网络的瓶颈功能:一分钟内90%准确度”一节中关注this post 。对于您的情况,唯一的区别是:

  1. 对于最后一层之前的图层,您应该大于256。
  2. 最后一层是具有线性激活的10000单位密集层(即根本没有激活)。您可以将预期输出从100x100重新整形为100000,或者为网络添加额外的重塑层以获得100x100的输出。
  3. 请记住,在网络的卷积部分和多层感知器部分(即最终的密集层)之间必须有{{1}}层来放置获取单个矩阵中的激活模式(在链接的帖子中搜索“Flatten”);你收到的错误就是因为这个。

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

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

答案 1 :(得分:1)

您应该会发现this paper有帮助。只需用卷积层替换完全连接的层。而不是对整个图像进行单一预测,结果将是图像较小部分的预测热图。

enter image description here

您应该使用categorical_crossentropy损失函数。