CNN仅收敛于binary_crossentropy损失函数,而在测试数据集上失败

问题在于用数据集训练cnn,该数据集包含输入(n,n)形状矩阵,其输入范围为0到1000。输出应表示具有相同的0值的(n,n)形状矩阵修补1到1000之间的其他值。(与去噪图像类似)

Example:
Input:             Output: 
135 0   283 4      135 75  283 4
25  38  43  0      25  38  43  815
0   99  820 481    533 99  820 481
728 331 3   28     728 331 3   28

通过使用遗传算法优化输入以优化外部成本函数来生成输入。 (此函数非常复杂,并且在外部专用程序中进行了计算) 整个数据集包含3000个输入和输出,每个输入和输出具有(10,10)形状。

由于该问题与图像处理神经网络相似,因此我决定使用cnn X_data 包含每个输入矩阵的值,而 Y_data 包含输出修补数据的二进制编码(十进制长10位)。 (设计出这种编码以减小输出大小并提高收敛速度)

Example:
X_data:            Y_data:
135 0   283 4      0 0 1 0 0 0 0 1 1 1 0 0 0 1 0 0 1 0 1 1...
25  38  43  0
0   99  820 481
728 331 3   28

仅当使用'binary_crossentropy'损失函数时,网络才会收敛,但是当我比较经过训练的cnn与新输入的性能时,并没有任何改善。 (我通过将cnn输出与相同外部成本函数下的遗传算法优化输出进行比较来衡量这一点)

问题:训练输入和输出数据集是否与此类问题兼容?数据集是否足够大以获得适当的结果,或者应该提供更多的训练数据?对输出数据进行编码是一种好方法,还是使经过训练的cnn无法正常工作的问题?如果还有其他方法上的缺陷,请帮我解决!

inshape = (dim,dim,1)
outshape = (dim*dim*10)

model = Sequential()     
inp = Input(inshape) 
x = BatchNormalization()(inp)
x = Conv2D(1000,kernel_size=3,padding='same')(x)
x = activation('relu')(x)    
x = Reshape((100,100,-1))(x)
x = MaxPooling2D(pool_size=(5,5))(x)
x = SpatialDropout2D(rate = 0.5)(x,training=True)    
x = Conv2D(250,padding='same')(x)
x = activation('relu')(x)
x = MaxPooling2D(pool_size=(4,4))(x)    
x = SpatialDropout2D(rate = 0.3)(x,training=True)
x = Conv2D(400,padding='same')(x) 
x = activation('sigmoid')(x)
x = MaxPooling2D(pool_size=(2,2))(x) 
x = Conv2D(2500,2))(x)  
x = BatchNormalization()(x)
x = flatten()(x)
out = Dense(outshape,activation='sigmoid',name='out')(x)
model = Model(inputs=inp,outputs=(out)) 
model.compile(optimizer=Adadelta(lr=1.0),loss = ['binary_crossentropy'],metrics =['accuracy'])
a16592664 回答:CNN仅收敛于binary_crossentropy损失函数,而在测试数据集上失败

首先,您真的需要CNN还是仅需要完全连接的层?要回答这个问题,请问问自己,例如在图像中,输入数据的值之间是否存在空间关系。现在您的问题:

训练输入和输出数据集是否与此类问题兼容?

是的。您需要的被称为去噪自动编码器(CNN或完全连接,取决于您的数据)。自动编码器在x上连续应用两个函数,以使f(g(x))= x',并且x和x'具有相同的大小。为了阻止自动编码器学习单位矩阵,中间的层要小得多。去噪是一种变体,因为输入数组中的零被视为噪声,并且您想要在输出层中重构丢失的信息。

数据集是否足够大以获得正确的结果?还是我需要更多数据?

这取决于将预测变量与结果相关联的功能的复杂性,以及数据的熵。尝试修改图层的宽度和深度,看看是否有帮助。

对输出数据进行编码是一种好方法,还是导致训练有素的CNN无法正常工作的问题?

单热编码在处理分类任务而不是回归任务时很有用。据我了解,即使您要输出整数,这里的工作也是一个回归任务。您可以简单地尝试使用实数矩阵在输出层上重建输入x,然后将它们四舍五入以计算损失,这可以是简单的RMSE(二进制交叉熵用于分类任务)。

现在,使神经网络正常工作是很复杂的,有很多不同的因素,仅靠知识是不够的。您还需要经验,试验和错误等。我建议您从简单开始,获得满意的结果,然后逐步尝试提高预测准确性。

本文链接:https://www.f2er.com/3131735.html

大家都在问