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_Keras_Deep Learning_Neural Network - Fatal编程技术网

Python 如何修改图层/模型以提高模型的准确性?

Python 如何修改图层/模型以提高模型的准确性?,python,tensorflow,keras,deep-learning,neural-network,Python,Tensorflow,Keras,Deep Learning,Neural Network,如何修改图层/模型以提高模型的准确性?我应该使用不同的激活或丢失功能吗?更多层次?你有什么建议 我的模型包括816张图片,分为3个类别用于培训,232张图片,分为3个类别用于验证 modelseq = Sequential([ layers.experimental.preprocessing.Rescaling(1./255, input_shape=(224, 224, 3)), layers.Conv2D(16, (3,3), padding='same', activation=

如何修改图层/模型以提高模型的准确性?我应该使用不同的激活或丢失功能吗?更多层次?你有什么建议

我的模型包括816张图片,分为3个类别用于培训,232张图片,分为3个类别用于验证

modelseq = Sequential([
  layers.experimental.preprocessing.Rescaling(1./255, input_shape=(224, 224, 3)),
  layers.Conv2D(16, (3,3), padding='same', activation='relu'),
  layers.Conv2D(16, (3,3), padding='same', activation='relu'),
  layers.MaxPooling2D(pool_size=(2,2)),
  layers.Conv2D(32, (3,3), padding='same', activation='relu'),
  layers.Conv2D(32, (3,3), padding='same', activation='relu'),
  layers.MaxPooling2D(pool_size=(2,2)),
  layers.Conv2D(64, (3,3), padding='same', activation='relu'),
  layers.Conv2D(64, (3,3), padding='same', activation='relu'),
  layers.MaxPooling2D(pool_size=(2,2)),
  # layers.Dropout(0.1),
  layers.Conv2D(128, (3,3), padding='same', activation='relu'),
  layers.MaxPooling2D(2,2),

  layers.Conv2D(256, (3,3), padding='same', activation='relu'),
  layers.Conv2D(256, (3,3), padding='same', activation='relu'),
  layers.Conv2D(256, (3,3), padding='same', activation='relu'),
  layers.MaxPooling2D(2,2),
  # layers.Dropout(0.1),

  layers.Conv2D(512, (3,3), padding='same', activation='relu'),
  layers.Conv2D(512, (3,3), padding='same', activation='relu'),
  layers.Conv2D(512, (3,3), padding='same', activation='relu'),
  layers.MaxPooling2D(2,2),

  layers.Conv2D(512, (3,3), padding='same', activation='relu'),
  layers.Conv2D(512, (3,3), padding='same', activation='relu'),
  layers.Conv2D(512, (3,3), padding='same', activation='relu'),
  layers.MaxPooling2D(2,2),


  layers.Flatten(),
  layers.Dense(len(folder),activation='relu'),
  layers.Dense(3,activation='softmax'),


  # layers.Dropout(0.6),
  # layers.Dense(3,activation='sigmoid')

 ])



modelseq.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])


modelseq.summary()
来自拟合生成器的结果

51/51 [==============================] - 19s 360ms/step - loss: 1.1383 - accuracy: 0.4428 - val_loss: 1.0920 - val_accuracy: 0.3879
Epoch 2/16
51/51 [==============================] - 18s 351ms/step - loss: 1.1010 - accuracy: 0.2365 - val_loss: 1.0899 - val_accuracy: 0.3879
Epoch 3/16
51/51 [==============================] - 18s 352ms/step - loss: 1.1070 - accuracy: 0.2813 - val_loss: 1.0870 - val_accuracy: 0.3879
Epoch 4/16
51/51 [==============================] - 18s 349ms/step - loss: 1.0733 - accuracy: 0.4730 - val_loss: 1.0883 - val_accuracy: 0.3879
Epoch 5/16
51/51 [==============================] - 18s 351ms/step - loss: 1.0814 - accuracy: 0.4281 - val_loss: 1.0873 - val_accuracy: 0.3879
Epoch 6/16
51/51 [==============================] - 18s 351ms/step - loss: 1.0890 - accuracy: 0.3486 - val_loss: 1.0871 - val_accuracy: 0.3879
Epoch 7/16
51/51 [==============================] - 18s 351ms/step - loss: 1.0813 - accuracy: 0.4949 - val_loss: 1.0855 - val_accuracy: 0.3879
Epoch 8/16
51/51 [==============================] - 18s 349ms/step - loss: 1.0888 - accuracy: 0.4450 - val_loss: 1.0844 - val_accuracy: 0.3879
Epoch 9/16
51/51 [==============================] - 18s 351ms/step - loss: 1.0641 - accuracy: 0.5454 - val_loss: 1.0837 - val_accuracy: 0.3879
Epoch 10/16
51/51 [==============================] - 18s 349ms/step - loss: 1.0657 - accuracy: 0.4772 - val_loss: 1.0834 - val_accuracy: 0.3879
Epoch 11/16
51/51 [==============================] - 18s 353ms/step - loss: 1.0911 - accuracy: 0.3621 - val_loss: 1.0831 - val_accuracy: 0.3879
Epoch 12/16
51/51 [==============================] - 18s 351ms/step - loss: 1.0797 - accuracy: 0.3686 - val_loss: 1.0826 - val_accuracy: 0.3879
Epoch 13/16
51/51 [==============================] - 18s 349ms/step - loss: 1.0747 - accuracy: 0.4091 - val_loss: 1.0822 - val_accuracy: 0.3879
Epoch 14/16
51/51 [==============================] - 18s 350ms/step - loss: 1.0781 - accuracy: 0.3401 - val_loss: 1.0820 - val_accuracy: 0.3879
Epoch 15/16
51/51 [==============================] - 18s 348ms/step - loss: 1.0873 - accuracy: 0.3769 - val_loss: 1.0818 - val_accuracy: 0.3879
Epoch 16/16
51/51 [==============================] - 18s 350ms/step - loss: 1.0881 - accuracy: 0.3628 - val_loss: 1.0815 - val_accuracy: 0.3879

我建议每层使用较少的层和神经元(与问题的规模相比,您的网络是一个巨大的网络)。此外,在输入端使用大层可能比在输出端使用大层更好。但是,请记住,此线程是关于编写代码时的技术问题,而您的问题与模型实现有关。

当然,您可以做许多不同的事情。还有一些变量/超参数没有提供学习率和验证分割。我本想说的是纪元数和批量大小,但我可以从培训打印输出中推断出来。我也可以推断验证分割,但我不打算计算

  • 不同的学习率
  • 不同的激活函数(elu或selu可能是个好主意,消失梯度不太明显)
  • 更多时代
  • 稀疏化
  • 正规化
  • 不同的优化器
  • 学习速率调度器
  • 学习速率调度器+优化器
  • 修剪(与稀疏化不完全相同)
  • 卷积滤波器的结构化初始化(线、角、圆、正方形等)
  • 跨步与合流(我不知道它们在准确性/性能方面的比较)
您的网络有很多参数,但训练样本不多。这立即意味着您可能需要超过您当前使用的16个纪元。我目前正在处理通过7层密集自动编码器的1D数据,我正在对它们进行10000次的训练。我可能会得到令人满意的结果,有5000个时代,甚至2500个时代。在10000个时代,我仍然没有看到过度拟合,但我也在使用300k+样本和更多参数。你没有太多的训练样本,所以你需要小心过度拟合

正则化和稀疏化将进一步降低训练速度,但它将有助于防止过度拟合,可能提高泛化能力,并可能通过足够的再训练获得更好的性能

在深度学习应用程序中,使用学习速率调度器可能比使用Adam之类的优化器更好。我个人无法证明这一点,但如果不引用我的资料(我太懒了),有一些论文建议使用标准SGD的学习率调度器实际上可以表现得更好。我个人曾在一些网络中与Adam一起使用学习速率调度器,因为Adam似乎在某个点上出现停滞,或者当有更多收敛空间时,收敛速度明显减慢。这种方法确实需要小心,因为它可能会使过度装配变得更容易。我已经核实了这是否是一个问题。您也可以使用不同的优化器。我不太了解各种优化器的特性,但据推测,AdamW是Adam的“修正”版本,因为显然,Adam在使用正则化方法时引入了意外特性

说到底,这不是一个恰当的问题。无论您使用的是哪种网络或数据,都没有一种通用的方法来提高性能。您要做的是查看结果,找出“问题”是什么,并实施据说可以解决这些问题的方法