from PIL import Image
from io import BytesIO
from IPython import display
import numpy as np
def display_image(arr):
b = BytesIO()
Image.fromarray(np.uint8(arr)).save(b, format='png')
data = b.getvalue()
display.display(display.Image(data=data, format='png', embed=True))
IMG_ROWS = 64
IMG_COLS = 64
data = np.load("../data/etl8.npz")['data']
import sklearn.model_selection
import keras
from scipy import ndimage
NUM_CLASSES = 956
# 150 ~ 159 for hyper parameters
alldata = data[0:150]
dataset_len = alldata.shape[0]
# flatten
x_all = alldata.reshape((dataset_len * NUM_CLASSES, IMG_ROWS, IMG_COLS, 1))
x_all = x_all.astype(np.float32)
x_all /= 255
y_all = np.tile(np.arange(NUM_CLASSES), dataset_len)
y_all = keras.utils.to_categorical(y_all, NUM_CLASSES)
# # distortion (gaussian noise)
# hard_len = int(dataset_len / 10)
# soft_len = int(dataset_len / 2)
# keep_len = dataset_len - hard_len - soft_len
# hard_seed = 0.2 * np.random.randn(hard_len * NUM_CLASSES, IMG_ROWS, IMG_COLS, 1)
# soft_seed = 0.05 * np.random.randn(soft_len * NUM_CLASSES, IMG_ROWS, IMG_COLS, 1)
# keep_seed = np.zeros((keep_len * NUM_CLASSES, IMG_ROWS, IMG_COLS, 1))
# seed = np.absolute(np.r_[hard_seed, soft_seed])
# seed = ndimage.gaussian_filter(seed, 1)
# seed = np.r_[seed, keep_seed]
# np.random.shuffle(seed)
# x_all += seed
# x_all /= (seed + 1)
# # distortion (inverse)
# choice = np.random.rand(dataset_len * NUM_CLASSES)
# x_all[np.where(choice > 0.5)] *= -1
# x_all[np.where(choice > 0.5)] += 1
x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(x_all, y_all, test_size=0.1)
Using TensorFlow backend.
from keras.layers import Conv2D, MaxPooling2D, Input
from keras.layers import Dense, Dropout, Flatten
from keras.layers.merge import Concatenate
from keras.models import Sequential, Model
from keras.layers.normalization import BatchNormalization
from keras.layers.advanced_activations import PReLU
from keras.preprocessing.image import ImageDataGenerator
input_shape = (IMG_ROWS, IMG_COLS, 1)
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), input_shape=input_shape))
model.add(BatchNormalization())
model.add(PReLU())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, kernel_size=(3, 3), input_shape=input_shape))
model.add(BatchNormalization())
model.add(PReLU())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, kernel_size=(3, 3), input_shape=input_shape))
model.add(BatchNormalization())
model.add(PReLU())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(1024))
model.add(BatchNormalization())
model.add(PReLU())
model.add(Dropout(0.25))
model.add(Dense(1024))
model.add(BatchNormalization())
model.add(PReLU())
model.add(Dropout(0.5))
model.add(Dense(NUM_CLASSES, activation='softmax'))
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(),
metrics=['accuracy'])
model.summary()
_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_1 (Conv2D) (None, 62, 62, 32) 320 _________________________________________________________________ batch_normalization_1 (Batch (None, 62, 62, 32) 128 _________________________________________________________________ p_re_lu_1 (PReLU) (None, 62, 62, 32) 123008 _________________________________________________________________ max_pooling2d_1 (MaxPooling2 (None, 31, 31, 32) 0 _________________________________________________________________ conv2d_2 (Conv2D) (None, 29, 29, 64) 18496 _________________________________________________________________ batch_normalization_2 (Batch (None, 29, 29, 64) 256 _________________________________________________________________ p_re_lu_2 (PReLU) (None, 29, 29, 64) 53824 _________________________________________________________________ max_pooling2d_2 (MaxPooling2 (None, 14, 14, 64) 0 _________________________________________________________________ conv2d_3 (Conv2D) (None, 12, 12, 128) 73856 _________________________________________________________________ batch_normalization_3 (Batch (None, 12, 12, 128) 512 _________________________________________________________________ p_re_lu_3 (PReLU) (None, 12, 12, 128) 18432 _________________________________________________________________ max_pooling2d_3 (MaxPooling2 (None, 6, 6, 128) 0 _________________________________________________________________ flatten_1 (Flatten) (None, 4608) 0 _________________________________________________________________ dense_1 (Dense) (None, 1024) 4719616 _________________________________________________________________ batch_normalization_4 (Batch (None, 1024) 4096 _________________________________________________________________ p_re_lu_4 (PReLU) (None, 1024) 1024 _________________________________________________________________ dropout_1 (Dropout) (None, 1024) 0 _________________________________________________________________ dense_2 (Dense) (None, 1024) 1049600 _________________________________________________________________ batch_normalization_5 (Batch (None, 1024) 4096 _________________________________________________________________ p_re_lu_5 (PReLU) (None, 1024) 1024 _________________________________________________________________ dropout_2 (Dropout) (None, 1024) 0 _________________________________________________________________ dense_3 (Dense) (None, 956) 979900 ================================================================= Total params: 7,048,188 Trainable params: 7,043,644 Non-trainable params: 4,544 _________________________________________________________________
from keras.callbacks import Callback, EarlyStopping
datagen = ImageDataGenerator(
rotation_range=12,
zoom_range=[0.9, 1.5],
width_shift_range=0.2,
height_shift_range=0.2,
fill_mode="constant",
cval=0.0
)
BATCH_SIZE = 128
steps = int(x_train.shape[0] / BATCH_SIZE)
model.fit_generator(datagen.flow(x_train, y_train, batch_size=BATCH_SIZE),
steps_per_epoch=steps, epochs=2, verbose=True,
validation_data=(x_test, y_test))
Epoch 1/2 1008/1008 [==============================] - 120s - loss: 5.5930 - acc: 0.0578 - val_loss: 3.7261 - val_acc: 0.2089 Epoch 2/2 1008/1008 [==============================] - 118s - loss: 2.2687 - acc: 0.4729 - val_loss: 1.2346 - val_acc: 0.6761
<keras.callbacks.History at 0x7eff792589b0>
train_len = x_train.shape[0]
# distortion (gaussian noise)
hard_len = int(train_len / 10)
soft_len = int(train_len / 2)
keep_len = train_len - hard_len - soft_len
hard_seed = 0.2 * np.random.randn(hard_len, IMG_ROWS, IMG_COLS, 1)
soft_seed = 0.05 * np.random.randn(soft_len, IMG_ROWS, IMG_COLS, 1)
keep_seed = np.zeros((keep_len, IMG_ROWS, IMG_COLS, 1))
seed = np.absolute(np.r_[hard_seed, soft_seed])
seed = ndimage.gaussian_filter(seed, 1)
seed = np.r_[seed, keep_seed]
np.random.shuffle(seed)
x_train += seed
x_train /= (seed + 1)
# distortion (inverse)
choice = np.random.rand(train_len)
x_train[np.where(choice > 0.5)] *= -1
x_train[np.where(choice > 0.5)] += 1
for i in range(10):
display_image(x_train[i, :, :, 0] * 255)
BATCH_SIZE = 128
steps = int(x_train.shape[0] / BATCH_SIZE)
model.fit_generator(datagen.flow(x_train, y_train, batch_size=BATCH_SIZE),
steps_per_epoch=steps, epochs=50, verbose=True,
validation_data=(x_test, y_test))
Epoch 1/50 1008/1008 [==============================] - 118s - loss: 2.3413 - acc: 0.4795 - val_loss: 0.3342 - val_acc: 0.9356 Epoch 2/50 1008/1008 [==============================] - 118s - loss: 1.1052 - acc: 0.7154 - val_loss: 0.1943 - val_acc: 0.9613 Epoch 3/50 1008/1008 [==============================] - 118s - loss: 0.8139 - acc: 0.7859 - val_loss: 0.1714 - val_acc: 0.9636 Epoch 4/50 1008/1008 [==============================] - 118s - loss: 0.6479 - acc: 0.8268 - val_loss: 0.1502 - val_acc: 0.9625 Epoch 5/50 1008/1008 [==============================] - 118s - loss: 0.5441 - acc: 0.8535 - val_loss: 0.0932 - val_acc: 0.9781 Epoch 6/50 1008/1008 [==============================] - 118s - loss: 0.4752 - acc: 0.8725 - val_loss: 0.0945 - val_acc: 0.9759 Epoch 7/50 1008/1008 [==============================] - 118s - loss: 0.4277 - acc: 0.8844 - val_loss: 0.0959 - val_acc: 0.9738 Epoch 8/50 1008/1008 [==============================] - 118s - loss: 0.3934 - acc: 0.8931 - val_loss: 0.0778 - val_acc: 0.9794 Epoch 9/50 1008/1008 [==============================] - 118s - loss: 0.3644 - acc: 0.9024 - val_loss: 0.0750 - val_acc: 0.9801 Epoch 10/50 1008/1008 [==============================] - 118s - loss: 0.3429 - acc: 0.9082 - val_loss: 0.0603 - val_acc: 0.9853 Epoch 11/50 1008/1008 [==============================] - 118s - loss: 0.3210 - acc: 0.9142 - val_loss: 0.0535 - val_acc: 0.9861 Epoch 12/50 1008/1008 [==============================] - 118s - loss: 0.3067 - acc: 0.9174 - val_loss: 0.0545 - val_acc: 0.9867 Epoch 13/50 1008/1008 [==============================] - 118s - loss: 0.2951 - acc: 0.9217 - val_loss: 0.0544 - val_acc: 0.9862 Epoch 14/50 1008/1008 [==============================] - 118s - loss: 0.2841 - acc: 0.9247 - val_loss: 0.0482 - val_acc: 0.9880 Epoch 15/50 1008/1008 [==============================] - 118s - loss: 0.2715 - acc: 0.9281 - val_loss: 0.0502 - val_acc: 0.9872 Epoch 16/50 1008/1008 [==============================] - 118s - loss: 0.2664 - acc: 0.9295 - val_loss: 0.0468 - val_acc: 0.9877 Epoch 17/50 1008/1008 [==============================] - 118s - loss: 0.2546 - acc: 0.9334 - val_loss: 0.0418 - val_acc: 0.9895 Epoch 18/50 1008/1008 [==============================] - 118s - loss: 0.2496 - acc: 0.9351 - val_loss: 0.0450 - val_acc: 0.9884 Epoch 19/50 1008/1008 [==============================] - 118s - loss: 0.2484 - acc: 0.9354 - val_loss: 0.0399 - val_acc: 0.9904 Epoch 20/50 1008/1008 [==============================] - 118s - loss: 0.2441 - acc: 0.9360 - val_loss: 0.0456 - val_acc: 0.9873 Epoch 21/50 1008/1008 [==============================] - 118s - loss: 0.2402 - acc: 0.9385 - val_loss: 0.0387 - val_acc: 0.9904 Epoch 22/50 1008/1008 [==============================] - 118s - loss: 0.2334 - acc: 0.9395 - val_loss: 0.0370 - val_acc: 0.9911 Epoch 23/50 1008/1008 [==============================] - 118s - loss: 0.2284 - acc: 0.9415 - val_loss: 0.0439 - val_acc: 0.9895 Epoch 24/50 1008/1008 [==============================] - 118s - loss: 0.2288 - acc: 0.9425 - val_loss: 0.0374 - val_acc: 0.9907 Epoch 25/50 1008/1008 [==============================] - 118s - loss: 0.2226 - acc: 0.9440 - val_loss: 0.0440 - val_acc: 0.9895 Epoch 26/50 1008/1008 [==============================] - 118s - loss: 0.2232 - acc: 0.9443 - val_loss: 0.0365 - val_acc: 0.9904 Epoch 27/50 1008/1008 [==============================] - 118s - loss: 0.2206 - acc: 0.9445 - val_loss: 0.0386 - val_acc: 0.9902 Epoch 28/50 1008/1008 [==============================] - 118s - loss: 0.2138 - acc: 0.9471 - val_loss: 0.0359 - val_acc: 0.9925 Epoch 29/50 1008/1008 [==============================] - 118s - loss: 0.2160 - acc: 0.9469 - val_loss: 0.0405 - val_acc: 0.9904 Epoch 30/50 1008/1008 [==============================] - 118s - loss: 0.2166 - acc: 0.9467 - val_loss: 0.0418 - val_acc: 0.9904 Epoch 31/50 1008/1008 [==============================] - 118s - loss: 0.2115 - acc: 0.9484 - val_loss: 0.0390 - val_acc: 0.9911 Epoch 32/50 1008/1008 [==============================] - 118s - loss: 0.2092 - acc: 0.9496 - val_loss: 0.0381 - val_acc: 0.9909 Epoch 33/50 1008/1008 [==============================] - 118s - loss: 0.2119 - acc: 0.9496 - val_loss: 0.0419 - val_acc: 0.9894 Epoch 34/50 1008/1008 [==============================] - 118s - loss: 0.2104 - acc: 0.9504 - val_loss: 0.0373 - val_acc: 0.9918 Epoch 35/50 1008/1008 [==============================] - 118s - loss: 0.2055 - acc: 0.9515 - val_loss: 0.0403 - val_acc: 0.9909 Epoch 36/50 1008/1008 [==============================] - 118s - loss: 0.2056 - acc: 0.9522 - val_loss: 0.0437 - val_acc: 0.9898 Epoch 37/50 1008/1008 [==============================] - 118s - loss: 0.2031 - acc: 0.9539 - val_loss: 0.0403 - val_acc: 0.9898 Epoch 38/50 1008/1008 [==============================] - 118s - loss: 0.2035 - acc: 0.9542 - val_loss: 0.0397 - val_acc: 0.9911 Epoch 39/50 1008/1008 [==============================] - 118s - loss: 0.1984 - acc: 0.9560 - val_loss: 0.0385 - val_acc: 0.9904 Epoch 40/50 1008/1008 [==============================] - 118s - loss: 0.1981 - acc: 0.9569 - val_loss: 0.0368 - val_acc: 0.9918 Epoch 41/50 1008/1008 [==============================] - 118s - loss: 0.1971 - acc: 0.9572 - val_loss: 0.0375 - val_acc: 0.9920 Epoch 42/50 1008/1008 [==============================] - 118s - loss: 0.1970 - acc: 0.9571 - val_loss: 0.0483 - val_acc: 0.9900 Epoch 43/50 1008/1008 [==============================] - 118s - loss: 0.1911 - acc: 0.9590 - val_loss: 0.0383 - val_acc: 0.9916 Epoch 44/50 1008/1008 [==============================] - 118s - loss: 0.1918 - acc: 0.9587 - val_loss: 0.0411 - val_acc: 0.9911 Epoch 45/50 1008/1008 [==============================] - 118s - loss: 0.1885 - acc: 0.9592 - val_loss: 0.0523 - val_acc: 0.9903 Epoch 46/50 1008/1008 [==============================] - 118s - loss: 0.1881 - acc: 0.9590 - val_loss: 0.0382 - val_acc: 0.9919 Epoch 47/50 1008/1008 [==============================] - 118s - loss: 0.1870 - acc: 0.9601 - val_loss: 0.0385 - val_acc: 0.9926 Epoch 48/50 1008/1008 [==============================] - 118s - loss: 0.1820 - acc: 0.9615 - val_loss: 0.0373 - val_acc: 0.9934 Epoch 49/50 1008/1008 [==============================] - 118s - loss: 0.1786 - acc: 0.9618 - val_loss: 0.0373 - val_acc: 0.9918 Epoch 50/50 1008/1008 [==============================] - 118s - loss: 0.1774 - acc: 0.9626 - val_loss: 0.0382 - val_acc: 0.9922
<keras.callbacks.History at 0x7f02983d84e0>
model.save("../etl8_noise_smoose.h5")
evaldata = data[150:]
dataset_len = evaldata.shape[0]
# flatten
x_eval = evaldata.reshape((dataset_len * NUM_CLASSES, IMG_ROWS, IMG_COLS, 1))
x_eval = x_eval.astype(np.float32)
x_eval /= 255
y_eval = np.tile(np.arange(NUM_CLASSES), dataset_len)
y_eval = keras.utils.to_categorical(y_eval, NUM_CLASSES)
model.evaluate(x_eval, y_eval)
9504/9560 [============================>.] - ETA: 0s
[0.021832448980774903, 0.99529288702928875]
score = model.predict(x_eval)
# predicted = np.array([np.argmax(r) for r in score])
predicted = np.argmax(score, axis=1)
idx, val = np.where(y_eval == 1)
ans = val[idx]
correct = np.where(predicted == ans)[0]
errors = np.where(predicted != ans)[0]
print(len(errors))
print(len(correct))
for e in errors:
display_image((x_eval[e] * 255).reshape(IMG_ROWS, IMG_COLS))
display_image(data[0][predicted[e]])
45 9515