Created
February 18, 2019 03:13
-
-
Save lidopypy/2e68698cc104f1b68542c9a0ddaa63a4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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