问题在于用数据集训练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'])