Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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 波动学习曲线_Python_Tensorflow_Conv Neural Network - Fatal编程技术网

Python 波动学习曲线

Python 波动学习曲线,python,tensorflow,conv-neural-network,Python,Tensorflow,Conv Neural Network,我正在训练一名CNN模特,下面是代码 model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300,3)), tf.keras.layers.MaxPooling2D(2, 2), tf.keras.layers.Conv2D(32, (3,3), activation='relu'), tf.keras

我正在训练一名CNN模特,下面是代码

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300,3)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Flatten(input_shape=(300, 300)),
    tf.keras.layers.Dense(512, activation=tf.nn.relu),
    tf.keras.layers.Dense(256, activation=tf.nn.relu),
    tf.keras.layers.Dense(64, activation=tf.nn.relu),
    tf.keras.layers.Dense(1, activation='linear')
])
我正在使用Adam,学习率为0.00003,培训时间为100个纪元

然而,验证的10个阶段开始在0.16和0.22之间波动。(我不能使用提前停止,因为每次重试训练时,都会在随机数个历元后达到最小值)

这种学习曲线正常吗?我能做些什么来改进它


是的,这是正常的,不必担心,但对于未来,我建议对图形应用平滑处理,这将帮助您更好地了解正在发生的事情。例如,请看我从tensorboard捕获的这张图

透明的图形具有初始值,较暗的图形是平滑的图形。平滑后的图显示,该模型正在使损失最小化,非常随意且缓慢,但它仍然在最小化


有时,查看平滑的图形有助于更好地识别模型的训练。

根据我的经验,这绝对正常,无需担心。您可以尝试将您的培训时间延长一点(大约为
500个
epoch)并降低您的学习率(将其除以
3
,然后再除以
10
),以查看您是否获得了更好的结果。您还可以尝试添加新的学习标准。我不知道你想解决什么问题,但是使用Conv2D,这通常是一个很好的主意。谢谢你的回答,我会试试这个。我用300个纪元试过,验证没有改变,我可以看出我拟合过度,因为只有测试减少到0。我尝试了辍学和批量标准化,但是错误增加了,它在0.18-0.28之间,好吧,那么我猜你仍然会尝试降低你的学习率,但是再一次,出现这种振荡是完全正常的(但它们可能是学习率过高的症状),这真的很有帮助,但在我的情况下,即使在300个时代之后,验证错误也是恒定的。你能告诉我如何减少它吗?获取更多的数据,增加它,或者尝试其他架构,这将有助于解决问题。很明显,你的模型与数据过度拟合,因此训练损失在减少,但验证损失在减少。一般来说,如果您的模型过度适合于少量数据,那么这意味着它有能力针对该问题进行概括,问题绝对是数据量,我可以看到您正在使用300x300图像来训练一个二元分类器,作为一个整体有多少图像?数据有偏见吗?也就是说,这两个类的分布是否相等?这些答案将帮助我们更好地理解这个问题数据集确实很小,很抱歉我没有激活函数,我只是在最后一层看到一个节点,并假设它是一个二进制分类器。对于回归,尤其是大量数据是必要的,就损失而言,您的验证数据似乎也很适合。我认为与其担心非递减损失,不如检查验证数据的MSE。另外,建议,如果你的值在2.5和3.5之间,最好从中减去2.5,这样你的网络预测在0-1之间,你可以在采样时加上2.5,得到相同的答案。在学习方面,我认为网络会更容易一些。可能是它根本不影响它。但最好是安全的