MNIST数据集上的CNN

时间:2019-07-28 00:13:52

标签: python machine-learning keras

我正在使用MNIST时尚数据集来尝试解决这个问题。我正在使用链接中的数据:

培训: http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz

训练集标签: http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz

测试集图像 http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz

测试集标签 http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz

我使用代码打开数据集:

def load_mnist(path, kind='train'):
    import os
    import gzip
    import numpy as np

    """Load MNIST data from `path`"""
    labels_path = os.path.join(path,
                               '%s-labels-idx1-ubyte.gz'
                               % kind)
    images_path = os.path.join(path,
                               '%s-images-idx3-ubyte.gz'
                               % kind)

    with gzip.open(labels_path, 'rb') as lbpath:
        labels = np.frombuffer(lbpath.read(), dtype=np.uint8,
                               offset=8)

    with gzip.open(images_path, 'rb') as imgpath:
        images = np.frombuffer(imgpath.read(), dtype=np.uint8,
                               offset=16).reshape(len(labels), 784)

    return images, labels

label = ['T-shirt/top',  'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt',
         'Sneaker', 'Bag', 'Ankle boot']

data_dir = './'
X_train, y_train = load_mnist('D:\book', kind='train')
X_test, y_test = load_mnist('D:\book', kind='t10k')

X_train = X_train.astype(np.float32) / 256.0
X_test = X_test.astype(np.float32) / 256.0

我正在尝试构建具有以下架构的卷积神经网络:

  • 具有32个3x3大小的滤镜的卷积层
  • ReLU激活功能
  • 2x2 MaxPooling
  • 具有64个3x3大小的滤镜的卷积层
  • ReLU激活功能
  • 2x2 MaxPooling
  • 全连接层,具有512个单元并具有ReLU激活功能
  • Softmax激活层用于输出层 使用SGD优化器进行100个时代

我的代码是:

X_train = X_train.reshape([60000, 28, 28, 1])
X_train = X_train.astype('float32') / 255.0
X_test = X_test.reshape([10000, 28, 28, 1])
X_test = X_test.astype('float32') / 255.0
model = Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=[28,28,1]))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.summary()
y_train = keras.utils.np_utils.to_categorical(y_train)
y_test = keras.utils.np_utils.to_categorical(y_test)
model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=100)

但是执行需要很多时间。大约每个纪元30分钟。我想我的代码做错了什么。有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我要强调的几点:

  • 在加载mnist数据集后查看代码中的以下行:

    X_train = X_train.astype(np.float32) / 256.0
    X_test = X_test.astype(np.float32) / 256.0 
    

    为什么要除以256.0?图像中的像素数据范围为0-255。因此,应将其除以255.0以将其归一化为0-1范围。

  • 在对数据进行一次归一化之后,便再次对其进行归一化。检查以下代码:

    X_train = X_train.reshape([60000, 28, 28, 1])
    X_train = X_train.astype('float32') / 255.0
    X_test = X_test.reshape([10000, 28, 28, 1])
    X_test = X_test.astype('float32') / 255.0
    

    在这里,重塑后,您将再次对其进行规范化。没有必要。多次标准化数据可能会减慢网络训练时的收敛速度。

  • 您没有在batch_size函数内传递model.fit值。根据文档here

      

    如果未指定,batch_size将默认为32。

    这可能是花费更多时间执行的原因。尝试将batch_size增加到100、200等,然后检查执行时间。

  • 如果有可能在cpu而不是gpu上训练模型。 60000x28x28训练数据不是一个小的数据集。