在 Mac Pro 上训练 MNIST 数据通常需要多长时间?

数据挖掘 美国有线电视新闻网 极简主义
2021-10-05 21:46:14

我的代码如下:

# define a simple CNN model
def baseline_model():
    # create model
    model = Sequential()
    model.add(Conv2D(30, (5, 5), input_shape=(1, 28, 28), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Conv2D(15, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.2))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dense(50, activation='relu'))
    model.add(Dense(num_classes, activation='softmax'))
    # Compile model
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model


# build the model
model = baseline_model()
# Fit the model
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=500, batch_size=200)
# Final evaluation of the model
scores = model.evaluate(X_test, y_test, verbose=0)

我的 Mac 容量:

Grphics Radeon Pro 555 2048 MB
Intel HD Graphics 630 1536 MB

Memeory 16 GB 2133 MHz LPDDR3

Processor 2.8 GHz Intel Core i7

在我的计算机上训练这个 MNIST 图像分类数据集需要几个小时。这是正常的吗?

2个回答

您是否尝试进行模型摘要并检查模型的大小。是的,我可能需要几个小时,因为你要添加很多层。尝试从 10 或 20 个 epoch 开始,逐步检查模型的准确性。可以减少你的训练时间。

当您进行上述练习时,最好有一个验证数据集,而不是一次又一次地将模型拟合到训练数据集上。

MNIST 输入形状的参数顺序错误。它应该是input_shape=(28, 28, 1)

此外,有时在代码工作之前不要在函数中编写代码是有意义的。在函数中调试代码更加困难。

我已经创建了您的代码的工作版本。它显示一个进度条,因此您应该能够看到代码估计需要多长时间才能完成。

import numpy as np
from tensorflow import keras
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense

# Model / data parameters
num_classes = 10
input_shape = (28, 28, 1)

# the data, split between train and test sets
(X_train, y_train), (X_test, y_test) = keras.datasets.mnist.load_data()

# Scale images to the [0, 1] range
X_train = X_train.astype("float32") / 255
X_test = X_test.astype("float32") / 255
# Make sure images have shape (28, 28, 1)
X_train = np.expand_dims(X_train, -1)
X_test = np.expand_dims(X_test, -1)
print("x_train shape:", X_train.shape)
print(X_train.shape[0], "train samples")
print(X_test.shape[0], "test samples")

# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

def baseline_model():
    "Define a simple CNN model"
    
    # create model
    model = Sequential()
    model.add(Conv2D(30, (5, 5), input_shape=(28, 28, 1), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Conv2D(15, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.2))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dense(50, activation='relu'))
    model.add(Dense(num_classes, activation='softmax'))
    # Compile model
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

# Build the model
model = baseline_model()

# Fit the model
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=500, batch_size=200)

# Final evaluation of the model
scores = model.evaluate(X_test, y_test, verbose=0)