From e02bca097cf41f6977a463ec87691e782da03e7f Mon Sep 17 00:00:00 2001 From: Connor Olding Date: Tue, 9 Aug 2016 01:11:05 -0700 Subject: [PATCH] . --- .dummy | 1 - resnet-1470729826.pkl | Bin 0 -> 25601 bytes resnet.py | 178 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 178 insertions(+), 1 deletion(-) delete mode 100644 .dummy create mode 100755 resnet-1470729826.pkl create mode 100755 resnet.py diff --git a/.dummy b/.dummy deleted file mode 100644 index 945c9b4..0000000 --- a/.dummy +++ /dev/null @@ -1 +0,0 @@ -. \ No newline at end of file diff --git a/resnet-1470729826.pkl b/resnet-1470729826.pkl new file mode 100755 index 0000000000000000000000000000000000000000..a39d212aa67e501bd42f217ac03c643452d253ce GIT binary patch literal 25601 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 Bk(dAg literal 0 HcmV?d00001 diff --git a/resnet.py b/resnet.py new file mode 100755 index 0000000..d9825b7 --- /dev/null +++ b/resnet.py @@ -0,0 +1,178 @@ +import pickle, time +import sys +import numpy as np +from keras.callbacks import LearningRateScheduler +from keras.datasets import mnist +from keras.layers import BatchNormalization +from keras.layers import Convolution2D, MaxPooling2D +from keras.layers import Flatten, Reshape +from keras.layers import Input, merge, Dense, Activation, Dropout +from keras.models import Model +from keras.utils.np_utils import to_categorical + +nb_classes = 10 +width = 28 +height = 28 +loss='categorical_crossentropy' + +name = 'resnet-{:.0f}'.format(time.time()) + +args = dict(enumerate(sys.argv)) +restore_fn = args.get(1) +if restore_fn == '.': # TODO: accept any directory + # just use most recent resnet-*.pkl file in directory + import os + is_valid = lambda fn: fn.startswith('resnet-') and fn.endswith('.pkl') + files = sorted([fn for fn in os.listdir(restore_fn) if is_valid(fn)]) + if len(files) == 0: + raise Exception("couldn't find any appropriate .pkl files in the CWD") + restore_fn = files[-1] + +dont_train = False +verbose_summary = False + +reslayers = 4 +size = 8 + +batch_size = 128 +epochs = 24 +convolutional = True +resnet_enabled = True +original_resnet = False +LR = 1e-2 +LRprod = 0.1**(1/20.) # will use a tenth of the learning rate after 20 epochs + +use_image_generator = True + +# the data, shuffled and split between train and test sets +(X_train, y_train), (X_test, y_test) = mnist.load_data() +X_train = X_train.reshape(X_train.shape[0], 1, width, height) +X_test = X_test.reshape(X_test.shape[0], 1, width, height) +X_train = X_train.astype('float32') / 255 +X_test = X_test.astype('float32') / 255 +# convert class vectors to binary class matrices +Y_train = to_categorical(y_train, nb_classes) +Y_test = to_categorical(y_test, nb_classes) + +if use_image_generator: + from keras.preprocessing.image import ImageDataGenerator + idg = ImageDataGenerator(rotation_range=5., + width_shift_range=.10, + height_shift_range=.10, + shear_range=5 / 180 * np.pi, + zoom_range=0.1, + fill_mode='constant', + cval=0.) + +# ReLU activation is supposed to be the best with he_normal +if convolutional: + layer = lambda x: Convolution2D(x, 3, 3, init='he_normal', border_mode='same') +else: + layer = lambda x: Dense(x, init='he_normal') + +# start construting the model +x = Input(shape=(1, width, height)) +y = x + +if convolutional: + # it might be worth trying other sizes here + y = Convolution2D(size, 7, 7, subsample=(2, 2), border_mode='same')(y) + y = MaxPooling2D()(y) +else: + y = Flatten()(y) + y = Dense(dense_size)(y) + +for i in range(reslayers): + skip = y + if original_resnet: + y = layer(size)(y) + y = BatchNormalization(axis=1)(y) + y = Activation('relu')(y) + y = layer(size)(y) + y = BatchNormalization(axis=1)(y) + if resnet_enabled: y = merge([skip, y], mode='sum') + y = Activation('relu')(y) + else: + y = BatchNormalization(axis=1)(y) + y = Activation('relu')(y) + y = layer(size)(y) + y = BatchNormalization(axis=1)(y) + y = Activation('relu')(y) + y = layer(size)(y) + if resnet_enabled: y = merge([skip, y], mode='sum') + +if convolutional: + from keras.layers import AveragePooling1D + y = Reshape((size, int(width * height / 2**2 / 2**2)))(y) + y = AveragePooling1D(size)(y) + y = Flatten()(y) + +y = Dense(nb_classes)(y) +y = Activation('softmax')(y) + +model = Model(input=x, output=y) + +if verbose_summary: + model.summary() +else: + total_params = 0 + for layer in model.layers: + total_params += layer.count_params() + print("Total params: {}".format(total_params)) + +if restore_fn: + with open(restore_fn, 'rb') as f: + W = pickle.loads(f.read()) + if not dont_train: + # sparsify an existing model + for i, w in enumerate(W): + if w.shape == (size, size, 3, 3): + middle = np.median(np.abs(w.flat)) + where = np.abs(w) < middle + total = np.prod(w.shape) + fmt = 'W[{}]: zeroing {} params of {}' + print(fmt.format(i, int(np.count_nonzero(where)), int(total))) + W[i] = np.where(where, 0, w) + model.set_weights(W) + LR /= 10 + +model.compile(loss=loss, optimizer='adam', metrics=['accuracy']) + +if not dont_train: + callbacks = [LearningRateScheduler(lambda e: LR * LRprod**e)] + + kwargs = dict( + nb_epoch=epochs, + validation_data=(X_test, Y_test), + callbacks=callbacks, + verbose=1 + ) + + if use_image_generator: + history = model.fit_generator(idg.flow(X_train, Y_train, batch_size=batch_size), + samples_per_epoch=len(X_train), **kwargs) + else: + history = model.fit(X_train, Y_train, batch_size=batch_size, + **kwargs) + +def evaluate(X, Y): + score = model.evaluate(X, Y, verbose=0) + for name, score in zip(model.metrics_names, score): + if name == "acc": + print("{:7} {:6.2f}%".format(name, score * 100)) + else: + print("{:7} {:7.5f}".format(name, score)) + +print('TRAIN') +evaluate(X_train, Y_train) + +print('TEST') +evaluate(X_test, Y_test) + +print('ALL') +evaluate(np.vstack((X_train, X_test)), np.vstack((Y_train, Y_test))) + +if not dont_train: + open(name+'.json', 'w').write(model.to_json()) + with open(name+'.pkl', 'wb') as f: + f.write(pickle.dumps(model.get_weights()))