【问题标题】:CNN Model not training on whole training set in epochs [duplicate]CNN模型未在时期内对整个训练集进行训练[重复]
【发布时间】:2021-07-09 17:59:07
【问题描述】:
#Resizing the image to make it suitable for apply convolution
import numpy as np
img_size = 28
X_trainr = np.array(X_train).reshape(-1, img_size, img_size, 1)
X_testr = np.array(X_test).reshape(-1, img_size, img_size, 1)


# Model Compilation
model.compile(loss = "sparse_categorical_crossentropy", optimizer = "adam", metrics = ["accuracy"])
model.fit(X_trainr, y_train, epochs = 5, validation_split = 0.2) #training the model

我为数字识别代码加载了 MNIST 数据集。 然后我将数据集拆分为训练集和测试集。 然后向 3D 训练集数组添加一个新维度,并将新数组命名为 X_trainr。 然后我编译并拟合了模型。 在拟合模型之后,模型并没有采用整个训练集(42000 个样本),而是只采用了 1500 个样本。 我尝试过: 设置 validation_split = 0.3 然后它在 1313 个样本上进行训练。 为什么我的模型没有采用整个训练集(42000 个样本)?

输出

Epoch 1/5
1500/1500 [==============================] - 102s 63ms/step - loss: 0.2930 - accuracy: 0.9063 - val_loss: 0.1152 - val_accuracy: 0.9649
Epoch 2/5
1500/1500 [==============================] - 84s 56ms/step - loss: 0.0922 - accuracy: 0.9723 - val_loss: 0.0696 - val_accuracy: 0.9780
Epoch 3/5
1500/1500 [==============================] - 80s 53ms/step - loss: 0.0666 - accuracy: 0.9795 - val_loss: 0.0619 - val_accuracy: 0.9818
Epoch 4/5
1500/1500 [==============================] - 79s 52ms/step - loss: 0.0519 - accuracy: 0.9837 - val_loss: 0.0623 - val_accuracy: 0.9831
Epoch 5/5
1500/1500 [==============================] - 84s 56ms/step - loss: 0.0412 - accuracy: 0.9870 - val_loss: 0.0602 - val_accuracy: 0.9818

【问题讨论】:

  • 你说的是我认为每个时代的步数。默认的批量大小是 32,这能告诉你什么吗?
  • 正如@Frightera 所说,1500 不是样本数。它是 每个 epoch 的步数。在每个步骤中,它需要一个批量大小的样本,如果您不指定,它会将其视为 32。
  • 批量大小对欠拟合或过拟合有影响吗?

标签: python tensorflow machine-learning keras conv-neural-network


【解决方案1】:

如果 X_trainr 最初有 42,000 个样本,并且您使用 0.2 的验证拆分,那么您正在训练 33600 个样本。在 model.fit 中,您没有指定批量大小,因此默认为 32。训练期间显示的数字不是样本数。它是什么,是训练样本数/batch_size。应该是 33600/32=1050。但是它显示 1500 所以我怀疑你的 X_trainr X .8 大小实际上是 48000。所以 Xtrainr= 48000/.8= 60000。检查 X_trainr 的尺寸。

【讨论】:

  • 感谢@Garry P,但是model.fit() 没有将整个X_trainr (拆分后将是48000) 合二为一不是问题吗时代?这个结果是否欠拟合?
  • 如果我们在model.fit()中设置batch_size = 1,我们可以得到想要的数字。即一个纪元将有 48000 步。原因是它现在将使用随机梯度下降进行训练。
猜你喜欢
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多