Neural network 利用keras保持空间信息的图像预测二维矩阵
我想训练CNN使用Keras从Neural network 利用keras保持空间信息的图像预测二维矩阵,neural-network,keras,Neural Network,Keras,我想训练CNN使用Keras从224x224x13图像预测100x100x1矩阵(热图)。我的想法是微调keras提供的预训练网络(resnet、Exception、vgg16等) 第一步是用预先训练好的顶层替换满足问题约束的顶层。我试图预测数值范围为0到1的热图图像。因此,我希望网络的输出为100x100x1矩阵。我相信如果我使用展平,然后使用密集层1000x1x1,我将失去我不想要的空间信息(对吧?) 我希望我的代码是灵活的,能够独立于正在使用的预训练体系结构运行(我必须运行许多实验)。因此
224x224x13
图像预测100x100x1
矩阵(热图)。我的想法是微调keras提供的预训练网络(resnet、Exception、vgg16等)
第一步是用预先训练好的顶层替换满足问题约束的顶层。我试图预测数值范围为0到1的热图图像。因此,我希望网络的输出为100x100x1
矩阵。我相信如果我使用展平
,然后使用密集
层1000x1x1
,我将失去我不想要的空间信息(对吧?)
我希望我的代码是灵活的,能够独立于正在使用的预训练体系结构运行(我必须运行许多实验)。因此,我想堆叠一个密集的
层,该层连接到前面任何类型层的每个单元(这取决于我将使用的预训练架构)
一些答案与完全卷积方法有关,但这不是我在这里的意思。我的X
和Y
都有固定的形状(224x224x3
和100x100x1
)
我的问题是,我现在不知道如何堆叠新层,使网络的预测/输出是100x100x1
矩阵。
正如答案中所建议的那样,我正在尝试添加一个100x100x1
density
层。但我似乎无法让它工作:
例如,如果我喜欢这样:
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:检查目标时出错:预期密集_1有4个维度,但得到的数组具有形状(64100100)
网络的Y
确实是批形状(64100100)
有什么建议吗
另外,我应该使用哪种损失函数?正如答案中所建议的,我可以使用mse
,但我想知道,是否有任何损失函数能够测量我所需100x100x1
输出的空间信息
提前谢谢
编辑:
由于@ncasas的回答,我半解决了我的问题:
我只是添加了一些反褶积层,直到得到类似于100x100x1
的输出。这不是我一开始想要的,因为这个实现对于构建在上面的预训练体系结构并不是不可知的。对于带有input_shape=(224224,224,3)
的exception
,此顶层给出的输出为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\u model
是keras.applications.exception(权重='imagenet',include\u top=False,input\u shape=(224224,224,3))
我终于使用了mse
作为损失函数,它工作得很好。您应该会发现它很有用。只需将完全连接的层替换为卷积层即可。结果将是图像较小部分的预测热图,而不是整个图像的单一预测
你应该使用分类交叉熵损失函数。你所描述的是多元线性回归加转移学习 为了重用经过培训的Keras模型的第一层,您可以在Keras博客的“使用预培训网络的瓶颈特性:一分钟内90%的准确率”一节中进行操作。就您的情况而言,唯一的区别在于:
展平层,以将获取的激活模式放置在单个矩阵中(在链接的帖子中搜索“展平”);您收到的错误就是因为这个
如果不想展平激活模式,可以直接在最后一层中使用。为此,您可以在“卷积自动编码器”一节中查看
通常用于回归问题的损失函数是均方误差(MSE)。如前所述,在回归中使用交叉熵是没有意义的。为什么分类交叉熵
而不是均方误差
?感谢您为什么均方误差而不是范畴性错误?感谢您能详细介绍一下如何添加100x100密集层(我已经用一些相关问题更新了我的问题)units
参数是密集层的神经元数量。如果我使用展平
,我会丢失空间信息,这是我不想要的。如何定义“100x100x1密集层”?很抱歉,我从未见过层的大小作为命名参数传递,总是将其用作Dense(200)
,我不知道它的名称。我已经澄清了这一部分,并添加了一个如何避免扁平化的示例。