我想训练CNN使用Keras从100x100x1
图像预测224x224x13
矩阵(热图)。我的想法是微调keras提供的预训练网络(resnet,Xception,vgg16等)。
然后,第一步是将预训练的顶层替换为满足我的问题约束的顶层。我正在尝试预测100x100x1
热图图像,其值范围为0到1.因此,我希望网络的输出为100x100x1
矩阵。我相信,如果我使用Flatten
,然后使用Dense
1000x1x1
Dense
层,我将丢失空间信息,这是我不想要的(对吧?)。
我希望我的代码具有灵活性,能够独立运行预训练架构(我必须运行许多实验)。因此,我希望堆叠一个X
层,该层连接到它之前的任何层的每个单元(这将取决于我将使用的预训练架构)。
有些答案与完全卷积方法有关,但这不是我的意思。我的Y
和224x224x3
都有固定的形状(分别为100x100x1
和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
,但我想知道,是否有任何能够测量我所需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
作为损失函数,它运行得很好。
答案 0 :(得分:2)
您所描述的是多维线性回归加转移学习。
为了重用训练有素的Keras模型的第一层,您可以在Keras博客的“使用预训练网络的瓶颈功能:一分钟内90%准确度”一节中关注this post 。对于您的情况,唯一的区别是:
请记住,在网络的卷积部分和多层感知器部分(即最终的密集层)之间必须有{{1}}层来放置获取单个矩阵中的激活模式(在链接的帖子中搜索“Flatten”);你收到的错误就是因为这个。
如果您不想展平激活模式,可能需要在最后一层中直接使用deconvolutions。为此,您可以在“卷积自动编码器”部分查看keras autoencoder tutorial。
用于回归问题的常用损失函数是均方误差(MSE)。使用交叉熵进行回归是没有意义的,如here所述。
答案 1 :(得分:1)
您应该会发现this paper有帮助。只需用卷积层替换完全连接的层。而不是对整个图像进行单一预测,结果将是图像较小部分的预测热图。
您应该使用categorical_crossentropy损失函数。