Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neural network 利用keras保持空间信息的图像预测二维矩阵_Neural Network_Keras - Fatal编程技术网

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

Neural network 利用keras保持空间信息的图像预测二维矩阵,neural-network,keras,Neural Network,Keras,我想训练CNN使用Keras从224x224x13图像预测100x100x1矩阵(热图)。我的想法是微调keras提供的预训练网络(resnet、Exception、vgg16等) 第一步是用预先训练好的顶层替换满足问题约束的顶层。我试图预测数值范围为0到1的热图图像。因此,我希望网络的输出为100x100x1矩阵。我相信如果我使用展平,然后使用密集层1000x1x1,我将失去我不想要的空间信息(对吧?) 我希望我的代码是灵活的,能够独立于正在使用的预训练体系结构运行(我必须运行许多实验)。因此

我想训练CNN使用Keras从
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%的准确率”一节中进行操作。就您的情况而言,唯一的区别在于:

  • 对于上一层之前的层,可能应该有大于256的值
  • 最后一层为10000单位密度层,具有线性激活(即完全没有激活)。您可以将预期输出从100x100重塑为100000,也可以向网络添加额外的重塑层以获得100x100输出
  • 请记住,在网络的卷积部分和多层感知器部分(即最后的密集层)之间,必须有一个
    展平
    层,以将获取的激活模式放置在单个矩阵中(在链接的帖子中搜索“展平”);您收到的错误就是因为这个

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


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

    为什么
    分类交叉熵
    而不是
    均方误差
    ?感谢您为什么
    均方误差
    而不是
    范畴性错误
    ?感谢您能详细介绍一下如何添加100x100密集层(我已经用一些相关问题更新了我的问题)
    units
    参数是
    密集层的神经元数量。如果我使用
    展平
    ,我会丢失空间信息,这是我不想要的。如何定义“100x100x1密集层”?很抱歉,我从未见过层的大小作为命名参数传递,总是将其用作
    Dense(200)
    ,我不知道它的名称。我已经澄清了这一部分,并添加了一个如何避免扁平化的示例。