我想训练一个 CNN 来使用 Keras 从 100x100x1
图像中预测 224x224x13
矩阵(热图)。我的想法是微调 keras 提供的预训练网络(resnet、Xception、vgg16 等)。
第一步是用预训练的顶层替换满足我的问题约束的顶层。我正在尝试预测值范围从 0 到 1 的 100x100x1
热图图像。因此我希望我的网络的输出是一个 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
输出的空间信息?提前致谢。
编辑:
由于@ncasas 的回答,我 半解决了 我的问题:
我只是添加了一些反卷积层,直到得到类似于
100x100x1
的输出。这不是我首先想要的,因为此实现与构建在其之上的预训练架构无关。对于带有 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
作为损失函数,它工作得很好。 最佳答案
您所描述的是多维线性回归加迁移学习。
为了重用经过训练的 Keras 模型的第一层,您可以关注 Keras 博客中的 this post,在“使用预训练网络的瓶颈特征:一分钟内达到 90% 的准确率”部分。对于您的情况,唯一的区别是:
请记住,在网络的卷积部分和多层感知器部分(即最终的 Dense 层)之间必须有一个
Flatten
层来将获得的激活模式放置在单个矩阵中(在链接的帖子中搜索“Flatten ");您收到的错误就是因为这个。如果您不想展平激活模式,您可能希望在最后一层直接使用 deconvolutions。为此,您可以在“卷积自动编码器”部分查看 keras autoencoder tutorial 。
用于回归问题的常用损失函数是均方误差 (MSE)。正如 here 所解释的那样,使用交叉熵进行回归是没有意义的。
关于neural-network - 使用保留空间信息的 keras 从图像中预测 2D 矩阵,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44477410/