Skip to content

Instantly share code, notes, and snippets.

@koshian2
Created June 1, 2018 15:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save koshian2/7a261cfe2ac198ebd41ccb32333c6653 to your computer and use it in GitHub Desktop.
Save koshian2/7a261cfe2ac198ebd41ccb32333c6653 to your computer and use it in GitHub Desktop.
CIFAR-10
import numpy as np
import matplotlib.pyplot as plt
import time
from keras.applications.vgg16 import VGG16
from keras.models import Sequential, Model
from keras.layers import Dense, Flatten
from keras.optimizers import Adam
from keras.datasets import cifar10
from keras.utils.np_utils import to_categorical
start_time = time.time()
# データの読み込み
(x_train_orig, y_train), (x_test_orig, y_test) = cifar10.load_data()
# 小数化
x_train_orig = x_train_orig / 255.0
x_test_orig = x_test_orig / 255.0
# データ数
m_train, m_test = x_train_orig.shape[0], x_test_orig.shape[0]
# yをOneHotVector化
y_train, y_test = to_categorical(y_train), to_categorical(y_test)
# VGG16に読み込めるように32x32→64x64にリサイズ
x_train, x_test = np.zeros((m_train, 64, 64, 3), dtype="float"), np.zeros((m_test, 64, 64, 3), dtype="float")
# Nearest-Neighbor
for i in range(x_train_orig.shape[1]):
for j in range(x_train_orig.shape[2]):
x_train[:, i*2, j*2, :] = x_train_orig[:, i, j, :]
x_train[:, i*2, j*2+1, :] = x_train_orig[:, i, j, :]
x_train[:, i*2+1, j*2, :] = x_train_orig[:, i, j, :]
x_train[:, i*2+1, j*2+1, :] = x_train_orig[:, i, j, :]
x_test[:, i*2, j*2, :] = x_test_orig[:, i, j, :]
x_test[:, i*2, j*2+1, :] = x_test_orig[:, i, j, :]
x_test[:, i*2+1, j*2, :] = x_test_orig[:, i, j, :]
x_test[:, i*2+1, j*2+1, :] = x_test_orig[:, i, j, :]
# メモリばかぐいするのでオリジナルを解法
x_test_orig, x_train_orig = None, None
# VGG16の読み込み
base_model = VGG16(include_top=False, input_shape=x_train.shape[1:])
# 転移学習用にVGGを訓練不可にする
for layer in base_model.layers:
layer.trainable = False
# Flatten以降を作る
top_model = Sequential()
top_model.add(Flatten(input_shape=base_model.output_shape[1:]))
top_model.add(Dense(100, activation="relu"))
top_model.add(Dense(10, activation="softmax"))
# モデルを結合する
model = Model(input=base_model.input, output=top_model(base_model.output))
# コンパイル
model.compile(optimizer=Adam(), loss="categorical_crossentropy", metrics=["accuracy"])
# フィット
history = model.fit(x_train, y_train, batch_size=64, epochs=25).history
# 経過時間
print("Elapsed[s] : ", time.time() - start_time)
# テスト精度
test_eval = model.evaluate(x_test, y_test)
print("train accuracy :", history["acc"][-1])
print("test accuracy :", test_eval[1])
# 訓練誤差のプロット
plt.plot(range(len(history["loss"])), history["loss"], marker=".")
plt.show()
# 2 epoch
#Elapsed[s] : 4225.965629577637
#10000/10000 [==============================] - 419s 42ms/step
#train accuracy : 0.70494
#test accuracy : 0.6898
# 25 epoch
#acc: 0.9172
#Elapsed[s] : 55869.90407681465
#10000/10000 [==============================] - 459s 46ms/step
#train accuracy : 0.91724
#test accuracy : 0.6987
#_________________________________________________________________
#Layer (type) Output Shape Param #
#=================================================================
#input_1 (InputLayer) (None, 64, 64, 3) 0
#_________________________________________________________________
#block1_conv1 (Conv2D) (None, 64, 64, 64) 1792
#_________________________________________________________________
#block1_conv2 (Conv2D) (None, 64, 64, 64) 36928
#_________________________________________________________________
#block1_pool (MaxPooling2D) (None, 32, 32, 64) 0
#_________________________________________________________________
#block2_conv1 (Conv2D) (None, 32, 32, 128) 73856
#_________________________________________________________________
#block2_conv2 (Conv2D) (None, 32, 32, 128) 147584
#_________________________________________________________________
#block2_pool (MaxPooling2D) (None, 16, 16, 128) 0
#_________________________________________________________________
#block3_conv1 (Conv2D) (None, 16, 16, 256) 295168
#_________________________________________________________________
#block3_conv2 (Conv2D) (None, 16, 16, 256) 590080
#_________________________________________________________________
#block3_conv3 (Conv2D) (None, 16, 16, 256) 590080
#_________________________________________________________________
#block3_pool (MaxPooling2D) (None, 8, 8, 256) 0
#_________________________________________________________________
#block4_conv1 (Conv2D) (None, 8, 8, 512) 1180160
#_________________________________________________________________
#block4_conv2 (Conv2D) (None, 8, 8, 512) 2359808
#_________________________________________________________________
#block4_conv3 (Conv2D) (None, 8, 8, 512) 2359808
#_________________________________________________________________
#block4_pool (MaxPooling2D) (None, 4, 4, 512) 0
#_________________________________________________________________
#block5_conv1 (Conv2D) (None, 4, 4, 512) 2359808
#_________________________________________________________________
#block5_conv2 (Conv2D) (None, 4, 4, 512) 2359808
#_________________________________________________________________
#block5_conv3 (Conv2D) (None, 4, 4, 512) 2359808
#_________________________________________________________________
#block5_pool (MaxPooling2D) (None, 2, 2, 512) 0
#_________________________________________________________________
#sequential_1 (Sequential) (None, 10) 205910
#=================================================================
#Total params: 14,920,598
#Trainable params: 205,910
#Non-trainable params: 14,714,688
#_________________________________________________________________
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment