Skip to content

Instantly share code, notes, and snippets.

@lidopypy
Created February 18, 2019 03:13
Show Gist options
  • Save lidopypy/2e68698cc104f1b68542c9a0ddaa63a4 to your computer and use it in GitHub Desktop.
Save lidopypy/2e68698cc104f1b68542c9a0ddaa63a4 to your computer and use it in GitHub Desktop.
from os.path import join
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
import numpy as np
batch_size = 128
num_classes = 10
epochs = 12
#建立資料夾,可以將callback儲存的log丟進來
log_dir = 'C:\\Users\\Lido_Lee\\Downloads\\google_mnist_ex'
# input image dimensions
img_rows, img_cols = 28, 28
# 直接從 Keras data 庫讀取 MNIST data
(x_train, y_train), (x_test, y_test) = mnist.load_data()
#判斷 Keras 後端讀取資料格式
if K.image_data_format() == 'channels_first':
x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
input_shape = (1, img_rows, img_cols)
else:
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)
#數據預處理,轉格float32格式,且值在0~1之間
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
# 將類標籤保存到metadata
with open(join(log_dir, 'metadata.tsv'), 'w') as f:
np.savetxt(f, y_test)
# 標籤預處理,用Keras to_categorical 做分類標籤(10個分類)
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
#建立模型
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu', name='features'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
#建立編譯器,選擇優化器、損失函數、指標
model.compile(optimizer=keras.optimizers.Adadelta(),
loss=keras.losses.categorical_crossentropy,
metrics=['accuracy'])
#回調函數,這邊使用EarlyStopping、TensorBoard
callbacks = [
keras.callbacks.EarlyStopping(monitor='acc',
patience=1, ),
keras.callbacks.TensorBoard(log_dir=log_dir,
histogram_freq=1,
batch_size=batch_size,
embeddings_freq=1,
write_graph=False,
embeddings_layer_names=['features'],
embeddings_metadata=['metadata.tsv'],
embeddings_data=x_test)
]
#丟進模型訓練,並調用 callbacks 儲存 log
history = model.fit(x_train, y_train,
batch_size=batch_size,
callbacks=callbacks,
epochs=epochs,
verbose=1,
validation_split=0.2
)
#驗證測試資料
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment