Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.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
Python CNN仅收敛于二元熵损失函数且在测试数据集上失败_Python_Tensorflow_Machine Learning_Keras - Fatal编程技术网

Python CNN仅收敛于二元熵损失函数且在测试数据集上失败

Python CNN仅收敛于二元熵损失函数且在测试数据集上失败,python,tensorflow,machine-learning,keras,Python,Tensorflow,Machine Learning,Keras,问题在于用一个数据集来训练CNN,该数据集包含0到1000之间数字的(n,n)形状矩阵的输入。输出应表示非常相同的(n,n)形状矩阵,其0值与1到1000之间的其他值相匹配。(与去噪图像类似) 通过优化外部成本函数的遗传算法运行输入,生成输出。(此函数非常复杂,由外部专用程序计算) 整个数据集包含3000个输入和输出,每个都有一个(10,10)形状 由于问题与图像处理神经网络相似,我决定使用CNNX_数据包含每个输入矩阵的值,Y_数据包含输出修补数据的二进制编码(10十进制长度)。(制定此编码以

问题在于用一个数据集来训练CNN,该数据集包含0到1000之间数字的(n,n)形状矩阵的输入。输出应表示非常相同的(n,n)形状矩阵,其0值与1到1000之间的其他值相匹配。(与去噪图像类似)

通过优化外部成本函数的遗传算法运行输入,生成输出。(此函数非常复杂,由外部专用程序计算) 整个数据集包含3000个输入和输出,每个都有一个(10,10)形状

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

只有当使用“二进制交叉熵”损失函数时,网络才会收敛,但当我比较经过训练的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无法工作的问题?

在处理分类任务而不是回归任务时,一个热编码非常有用。据我所知,这里有一个回归任务,即使你试图输出整数。您可以简单地尝试用实数矩阵在输出层重构输入x,并最终将它们四舍五入以计算您的损失,这可能是一个简单的RMSE(二进制交叉熵用于分类任务)


现在,让神经网络工作起来很复杂,有很多不同的因素,光靠知识是不够的。你还需要经验、尝试和错误等。我建议你从简单开始,获得令人满意的结果,然后尝试一步一步地提高预测精度

首先,你真的需要有线电视新闻网,还是只需要完全连接的层?要回答这个问题,请自问输入数据的值之间是否存在空间关系,如图像中的值。现在回答您的问题:

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

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

数据集是否足够大以获得适当的结果,还是需要更多数据?

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

对输出数据进行编码是一种好方法,还是使经过培训的CNN无法工作的问题?

在处理分类任务而不是回归任务时,一个热编码非常有用。据我所知,这里有一个回归任务,即使你试图输出整数。您可以简单地尝试用实数矩阵在输出层重构输入x,并最终将它们四舍五入以计算您的损失,这可能是一个简单的RMSE(二进制交叉熵用于分类任务)

现在,让神经网络工作起来很复杂,有很多不同的因素,光靠知识是不够的。你还需要经验、尝试和错误等。我建议你从简单开始,获得令人满意的结果,然后尝试一步一步地提高预测精度

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
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'])