keras mnist 實例

目的:實現mnist分類
1.加載mnist圖片數據網絡

(train_x, train_y), (test_x, test_y) = mnist.load_data()

2.修改數據類型,數據歸一化學習

# 將數據轉化爲浮點型
  x_train = train_x.astype('float32')
  y_train = train_y.astype('float32')
  x_test = test_x.astype('float32')
  y_test = test_y.astype('float32')
  #數據歸一化
  x_train /= 255
  x_test /= 255
  # 標籤進行one_hont編碼
  y_train = keras.utils.to_categorical(y_train, num_classes=10)
  y_test = keras.utils.to_categorical(y_test, num_classes=10)
  1. 修改數據形狀
x_train = x_train.reshape(60000, 28, 28, 1)
x_test = x_test.reshape(10000, 28, 28, 1)

4.搭建學習網絡編碼

model = Sequential([
        Conv2D(filters=6, kernel_size=(5, 5), padding='valid', activation='tanh', input_shape=(28, 28, 1)),
        MaxPooling2D(pool_size=(2, 2)),
        Conv2D(filters=16, kernel_size=(5, 5), padding='valid', activation='tanh'),
        MaxPooling2D(pool_size=(2, 2)),
        Flatten(),
        Dense(120, activation='tanh'),
        Dense(84, activation='tanh'),
        Dense(10, activation='softmax')
    ])

5.配置學習網絡lua

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])

6.開始訓練code

model.fit(x_train, y_train, batch_size=64, epochs=20, verbose=1, validation_split=0.2, shuffle=True)

7.評價網絡圖片

score = model.evaluate(x_test, y_test, batch_size=64)
 print(score)

遇到問題:
1.input

ValueError: Negative dimension size caused by subtracting 5 from 1 for 'conv2d_1/convolution' (op: 'Conv2D') with input shapes: [?,1,28,28], [5,5,28,6].

這是由於原本案例用的是Theano做爲keras的後臺,Theano的格式是(1,28,28)的格式,若是是TensorFlow須要修改輸入格式爲(28,28,1)
2.it

Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (60000, 28, 28)

直接導入的mnist數據爲(60000,28,28),而這你的cnn網絡須要的是(60000,28,28,1),因此須要修改矩陣形狀爲(60000,28,28,1)io

x_train = x_train.reshape(60000, 28, 28,1)
    x_test = x_test.reshape(10000, 28, 28,1)

完整代碼ast

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Flatten
from keras.layers import Conv2D, MaxPooling2D

if __name__ == "__main__":
    (train_x, train_y), (test_x, test_y) = mnist.load_data()
    x_train = train_x.astype('float32')
    y_train = train_y.astype('float32')
    x_test = test_x.astype('float32')
    y_test = test_y.astype('float32')

    x_train /= 255
    x_test /= 255

    y_train = keras.utils.to_categorical(y_train, num_classes=10)
    y_test = keras.utils.to_categorical(y_test, num_classes=10)
    x_train = x_train.reshape(60000, 28, 28, 1)
    x_test = x_test.reshape(10000, 28, 28, 1)

    model = Sequential([
        Conv2D(filters=6, kernel_size=(5, 5), padding='valid', activation='relu', input_shape=(28, 28, 1)),
        MaxPooling2D(pool_size=(2, 2)),
        Conv2D(filters=16, kernel_size=(5, 5), padding='valid', activation='relu'),
        MaxPooling2D(pool_size=(2, 2)),
        Flatten(),
        Dense(120, activation='relu'),
        Dense(84, activation='relu'),
        Dense(10, activation='softmax')
    ])
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
    model.fit(x_train, y_train, batch_size=64, epochs=20, verbose=1, validation_split=0.2, shuffle=True)
    score = model.evaluate(x_test, y_test, batch_size=64)
    print(score)
    model.save('lenet5.h5')
相關文章
相關標籤/搜索