gpt4 book ai didi

python - CNN 仅针对 binary_crossentropy 损失函数收敛并且在测试数据集上失败

转载 作者:行者123 更新时间:2023-11-30 09:14:47 24 4
gpt4 key购买 nike

问题在于使用包含 0 到 1000 之间数字的 (n,n) 形状矩阵输入的数据集训练 CNN。输出应表示具有 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, kernel_size=3,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, kernel_size=3,padding='same')(x)
x = Activation('sigmoid')(x)
x = MaxPooling2D(pool_size=(2,2))(x)
x = Conv2D(2500, kernel_size=3,padding='same')(x)
x = Activation('sigmoid')(x)
x = MaxPooling2D(pool_size=(2,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'])

最佳答案

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

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

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

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

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

输出数据的编码是一个好方法,还是导致经过训练的 CNN 无法工作的问题?

当您处理分类任务而不是回归任务时,One-hot 编码非常有用。据我了解,即使您尝试输出整数,这里也是一个回归任务。您可以简单地尝试使用实数矩阵重建输出层上的输入 x,并最终将它们舍入以计算损失,这可能是一个简单的 RMSE(二元交叉熵用于分类任务)。

现在,让神经网络发挥作用很复杂,有很多不同的因素,仅靠知识是不够的。你还需要经验、尝试和错误等。我建议你从简单开始,得到满意的结果,然后逐步尝试提高你的预测精度。

关于python - CNN 仅针对 binary_crossentropy 损失函数收敛并且在测试数据集上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58782306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com