【问题标题】:CNN model not training on complete dataset [duplicate]CNN 模型未在完整数据集上进行训练 [重复]
【发布时间】:2021-07-03 09:22:39
【问题描述】:

我的数据集是 mnist sign_language_train 图像数据集,大约有 27000 个条目。 我将它划分为一个大约有 21000 个条目的训练集和一个大约有 6000 个条目的验证集。但是,当我将数据拟合到模型中时,它每个 epoch 只训练 687 个条目。

X_train, X_validate, y_train, y_validate = train_test_split(X_train, y_train, test_size = 0.2,random_state = 123)
X_train = X_train.reshape(X_train.shape[0], *(28, 28, 1))
X_test = X_test.reshape(X_test.shape[0], *(28, 28, 1))
X_validate = X_validate.reshape(X_validate.shape[0], *(28, 28, 1))

print(X_train.shape) -->(21964, 28, 28, 1)
print(y_train.shape) -->(21964,)
print(X_validate.shape) -->(5491, 28, 28, 1)
print(y_validate.shape) -->(5491,)

model = Sequential()

model.add(Conv2D(filters=32, kernel_size=(3, 3), activation='relu', input_shape=(28,28,1)))
model.add(MaxPool2D(pool_size=(2, 2), strides=2))

model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu', input_shape = (28,28,1)))
model.add(MaxPool2D(pool_size=(2, 2), strides=2))

model.add(Conv2D(filters=128, kernel_size=(3, 3), activation='relu', input_shape = (28,28,1)))
model.add(MaxPool2D(pool_size=(2, 2), strides=2))

model.add(Flatten())

model.add(Dense(64,activation ="relu"))
model.add(Dense(128,activation ="relu"))
#model.add(Dropout(0.2))
model.add(Dense(128,activation ="relu"))
#model.add(Dropout(0.3))
model.add(Dense(25,activation ="softmax"))

然后我拟合上面提到的训练和验证集,如下所示,对于每个 epoch,它只训练 687 个条目。

model.compile(optimizer=SGD(learning_rate=0.001), loss='sparse_categorical_crossentropy', metrics=['accuracy'])
history2=model.fit(X_train, y_train, epochs = 50, validation_data = (X_validate, y_validate))

【问题讨论】:

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


    【解决方案1】:

    我认为您对 keras 日志感到困惑。您在训练时在 Epoch 日志中看到的数字不是样本总数,而是批次总数。您在训练中有21964 样本,默认批量大小为 32,因此您将看到 21964/32=686.375=687 迭代(最后一批未满)。如果您想确认,请将 batch_size 设置为 1,然后您应该会看到 21964 迭代,每批一个样本。

    样本

    def train():
      mnist = tf.keras.datasets.mnist
      (x_train, y_train), (x_test, y_test) = mnist.load_data()
      print (x_train.shape)
    
      #nomalize data
      x_train = tf.keras.utils.normalize(x_train, axis=1)
      x_test = tf.keras.utils.normalize(x_test, axis=1)
      #train model
      model = tf.keras.models.Sequential()
      model.add(tf.keras.layers.Flatten())
      model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
      model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
      model.add(tf.keras.layers.Dense(10, activation=tf.nn.softmax))
    
      model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', 
              metrics=['accuracy'])
      model.fit(x_train, y_train, epochs=1)
      return model
    
    model = train()
    

    输出:

    (60000, 28, 28)
    1875/1875 [=====================] - 5s 2ms/step - loss: 0.2594 - accuracy: 0.9240
    

    在上面的示例中,我们有60000 样本和32 的批量大小(默认),因此我们应该有1875 迭代,如纪元日志中所示。

    【讨论】:

    • 明白了。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 2020-10-22
    • 2019-04-15
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多