Tensorflow 这是适合我的神经网络的拓扑结构吗?

Tensorflow 这是适合我的神经网络的拓扑结构吗?,tensorflow,machine-learning,image-processing,neural-network,deep-learning,Tensorflow,Machine Learning,Image Processing,Neural Network,Deep Learning,我正在尝试为纹理开发一个CBIR(基于内容的图像检索)系统。由于类别和未标记数据数量巨大,我现在的方法是使用自动编码器来提取特征,然后使用余弦相似性来选择与所提供纹理最相似的纹理。我做了一些测试,这个想法似乎很好,但我对NN的设计有很多问题。我正在使用一个痉挛式自动编码器,现在看起来像这样: _________________________________________________________________ Model: "sequential" _________________

我正在尝试为纹理开发一个CBIR(基于内容的图像检索)系统。由于类别和未标记数据数量巨大,我现在的方法是使用自动编码器来提取特征,然后使用余弦相似性来选择与所提供纹理最相似的纹理。我做了一些测试,这个想法似乎很好,但我对NN的设计有很多问题。我正在使用一个痉挛式自动编码器,现在看起来像这样:

_________________________________________________________________
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
e_conv1 (Conv2D)             (None, 128, 128, 32)      320       
_________________________________________________________________
e_pool1 (MaxPooling2D)       (None, 64, 64, 32)        0         
_________________________________________________________________
e_conv2 (Conv2D)             (None, 64, 64, 16)        4624      
_________________________________________________________________
e_pool2 (MaxPooling2D)       (None, 32, 32, 16)        0         
_________________________________________________________________
e_conv3 (Conv2D)             (None, 32, 32, 16)        2320      
_________________________________________________________________
e_pool3 (MaxPooling2D)       (None, 16, 16, 16)        0         
_________________________________________________________________
e_conv41 (Conv2D)            (None, 16, 16, 8)         1160      
_________________________________________________________________
e_pool4 (MaxPooling2D)       (None, 8, 8, 8)           0         
_________________________________________________________________
e_conv42 (Conv2D)            (None, 8, 8, 8)           584       
_________________________________________________________________
e_pool42 (MaxPooling2D)      (None, 4, 4, 8)           0         
_________________________________________________________________
e_conv43 (Conv2D)            (None, 4, 4, 8)           584       
_________________________________________________________________
flatten (Flatten)            (None, 128)               0         
_________________________________________________________________
reshape (Reshape)            (None, 4, 4, 8)           0         
_________________________________________________________________
d_conv00 (Conv2D)            (None, 4, 4, 8)           584       
_________________________________________________________________
d_pool01 (UpSampling2D)      (None, 8, 8, 8)           0         
_________________________________________________________________
d_conv01 (Conv2D)            (None, 8, 8, 8)           584       
_________________________________________________________________
d_pool0 (UpSampling2D)       (None, 16, 16, 8)         0         
_________________________________________________________________
d_conv02 (Conv2D)            (None, 16, 16, 8)         584       
_________________________________________________________________
d_pool1 (UpSampling2D)       (None, 32, 32, 8)         0         
_________________________________________________________________
d_conv1 (Conv2D)             (None, 32, 32, 16)        1168      
_________________________________________________________________
d_pool2 (UpSampling2D)       (None, 64, 64, 16)        0         
_________________________________________________________________
d_conv2 (Conv2D)             (None, 64, 64, 16)        2320      
_________________________________________________________________
d_pool3 (UpSampling2D)       (None, 128, 128, 16)      0         
_________________________________________________________________
d_conv3 (Conv2D)             (None, 128, 128, 32)      4640      
_________________________________________________________________
logits (Conv2D)              (None, 128, 128, 1)       289       
=================================================================
Total params: 19,761
Trainable params: 19,761
Non-trainable params: 0
_________________________________________________________________
优化器是adam,损失函数是mse。我现在使用的图像是灰度的,以便能够加快测试速度。我正在使用kerasapi进行测试。输入图像大小为128x128,但原始图像介于500x500和1700x1700之间

我现在面临的最大问题是,网络不是在学习高级功能,它只是学习位置和灰度值。纹理细节非常小,结果(解码图像)似乎是输入图像的模糊版本,似乎不适用于分类。我不确定应该如何设计NN,因为我没有找到任何指南来解释如何组合多个层以达到预期的结果(但我找到了许多教程来解释每个层是如何工作的)。 这张图片是彩色的,32x32,因为它是从第一次测试,但在灰度和超过1000纹理,这将无法工作,因为它的模糊

我的另一个疑问是,我不确定在训练中是否应该使用相同的图像进行输入和输出,或者是否应该使用相同纹理的不同图像。我认为这应该迫使NN学习高级功能,但我不确定这是否有效

我面临的另一个问题是,目前我没有足够的计算机,可以让我使用训练有素的NN进行测试(很快我就会有一台,现在我在谷歌colaboratory上使用免费的k80),所以我不确定不良结果是由于设计不好还是缺乏培训。神经网络首先学习低级特征,然后学习高级特征,它学习得很慢,还是应该直接学习高级特征?我还发现,在编码结束时,大约三分之一的特征值为0(在同一位置的所有纹理中),这对我来说似乎不正确。这正常吗?更多的培训是否应该让这些功能获得价值?这可能与即将死亡的relu节点的问题有关吗

EDIT1: 如果你想知道我想用我发现的更多细节做什么
几天前的一篇文章中,作者和我有同样的问题,并采取同样的方法来解决它们。你唯一要做的就是用纹理来代替“魔卡”。我的数据由20000张不同大小的图像和1000到5000种不同类型的纹理组成。

如果我理解了这篇文章,他们正在构建一个自动编码器,对数据进行去噪,以便稍后通过在其上添加一些层对其进行分类。在您的情况下,我不确定自动编码器结构是否必要,因为您只想对纹理进行分类


如果您想保留使用度量来选择与所提供纹理最相似的纹理的想法,例如,您可以使用类似于(R-MAC方法)的策略。

在您的解释中有点迷失,但是如果你需要检查一组纹理和一个新图像之间的相似性,也许a是有用的。在以后的步骤中,我还需要对图像进行去噪,所以我认为这是一个很好的方法。问题是,现在我需要的结果,以便能够继续在这个项目中工作,所以我使用的图像没有噪音,以便使一个更容易的培训。我遇到的另一个问题是,我正在使用的纹理不是通过重复模式创建的,它们要复杂得多,所以我的想法是,使用数学运算定义纹理对我来说太难了,但NN可以自己学习。事实上,如果您需要在某一点对数据进行去噪,这可能是一个很好的方法。也许以下过程可以帮助你:1。仅训练位于去噪器2顶部的分类器。训练(和测试)后,添加去噪器并使用分类器对其进行训练