当前位置: 首页 > 知识库问答 >
问题:

利用keras保持空间信息的图像预测二维矩阵

澹台锐
2023-03-14

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

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

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

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

我的问题是,我现在不知道如何堆叠新层,使网络的预测/输出是100x100x1矩阵。正如答案中所建议的那样,我正在尝试添加一个100x100x1density层。但我似乎无法让它工作:例如,如果我喜欢这样:

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=(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.X的(权重='Imagenet',include_top=False,input_shape=(224, 224, 3))

我终于使用mse作为损失函数,它的工作原理很好。

共有2个答案

华锦程
2023-03-14

你会发现这篇论文很有帮助。只需将完全连接的层替换为卷积层即可。结果将是图像较小部分的预测热图,而不是整个图像的单一预测。

你应该使用分类熵损失函数

姚雅珺
2023-03-14

你所描述的是一个多元线性回归加上迁移学习。

为了重用经过训练的Keras模型的第一层,您可以在Keras博客的“使用预先训练的网络的瓶颈特性:一分钟内90%的准确率”一节中阅读这篇文章。就您的情况而言,唯一的区别在于:

  1. 对于上一层之前的层,可能应该有大于256的值

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

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

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

 类似资料:
  • 在keras中安装神经网络之前,我正在处理我的图像。我希望在预处理后但在训练模型之前看到图像的样子(这样我可以确保预处理正确)。下面的命令生成一个对象并将其存储在train_image_array_gen中。但是,当我尝试访问每个图像时,它们存储为多维像素矩阵。如何直观地显示每个像素矩阵?

  • 上传图像做预测时出错消息 ValueError:层block1\u conv1的输入0与层不兼容:输入形状的ed轴-1应具有值3,但接收到带有形状的输入[无,2 24,224,4] 代码处理/图像预处理 def model\U predict(img,模型):img=img。调整大小((224224)) 培训课程的产出 flow/compiler/xla/service/service.cc:17

  • 本文向大家介绍Numpy 将二维图像矩阵转换为一维向量的方法,包括了Numpy 将二维图像矩阵转换为一维向量的方法的使用技巧和注意事项,需要的朋友参考一下 以下的例子,将32x32的二维矩阵,装换成1x1024的向量 以上这篇Numpy 将二维图像矩阵转换为一维向量的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 我需要在灰度图像中分割出异常。在算法的某个地方,我计算一个矩阵,其中包含需要设置为零的已知像素强度。我该怎么做? 例如: 计算的像素强度:(数组([94,95,96,97,98,99,100,101,102,103,104,105,106,107、108,109,110,111、112、113、114、115、116、117、118、119、120、121、122、123、124、125、126、

  • 本文向大家介绍常用的图像空间相关面试题,主要包含被问及常用的图像空间时的应答技巧和注意事项,需要的朋友参考一下 HSI、HSV、RGB、CMY、CMYK、HSL、HSB、Ycc、XYZ、Lab、YUV色彩空间(颜色模型) RGB颜色空间是算法处理中应用最多的颜色空间。 HSI颜色空间,色调(Hue)、色饱和度(Saturation或Chroma)和亮度(Intensity或Brightness)

  • 问题内容: 根据[本教程](https://towardsdatascience.com/keras-transfer-learning-for- beginners-6c9b8b7143e ),我正在使用转移学习方法在Keras中使用按训练的VGG19模型。它显示了如何训练模型,但没有显示如何为预测准备测试图像。 在评论部分中说: 获取图像,使用相同的函数预处理图像,然后调用。这将为您提供该图像