Skip to content
Snippets Groups Projects
Commit f28b8bd7 authored by Hashim Sharif's avatar Hashim Sharif
Browse files

Moving AlexNet2 to new Benchmark Structure

parent ef55d552
No related branches found
No related tags found
No related merge requests found
......@@ -196,6 +196,6 @@ def dumpHPVMToKerasModel(model, reload_dir, output_model, X_test, Y_test):
optimizer=Adam(lr=0.0001, decay=1e-6),
metrics=['accuracy'])
model.save("alexnet.h5")
model.save(output_model)
return model
import sys
import keras
from keras.models import Sequential
from keras.utils import np_utils
......@@ -11,233 +12,143 @@ from keras.callbacks import LearningRateScheduler
import numpy as np
import os
import struct
from Benchmark import Benchmark
from keras import backend as K
from approxhpvm_translator import translate_to_approxhpvm
from frontend.approxhpvm_translator import translate_to_approxhpvm
def dumpWeights(file_name, weights, N, H, W, C):
# NOTE: Writing the NHWC weights array as NCHW
f = open(file_name, "wb")
for i in range(N):
for j in range(C):
for k in range(H):
for l in range(W):
f.write(weights[i][k][l][j])
class AlexNet2(Benchmark):
f.close()
def dumpConvWeights(file_name, weights, N, C, H, W):
print (weights.shape)
f = open(file_name, "wb")
for i in range(N):
for j in range(C):
for k in range(H):
for l in range(W):
f.write(weights[k][l][j][i])
f.close()
def lr_schedule2(self, epoch):
lrate = 0.0005
if epoch > 100:
lrate = 0.0003
if epoch > 200:
lrate = 0.0002
if epoch > 250:
lrate = 0.0001
if epoch > 300:
lrate = 0.00003
return lrate
def dumpFcWeights(file_name, weights, H, W):
print (weights.shape)
def buildModel(self):
f = open(file_name, "wb")
for i in range(H):
for j in range(W):
f.write(weights[i][j])
f.close()
weight_decay = 1e-4
activation_type = 'tanh'
model = Sequential()
model.add(Conv2D(32, (3,3), padding='same', kernel_regularizer=regularizers.l2(weight_decay), input_shape=(3, 32, 32) ))
model.add(Activation(activation_type))
model.add(Conv2D(32, (3,3), padding='same', kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation(activation_type))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))
def dumpFcBias(file_name, bias, W):
model.add(Conv2D(64, (3,3), padding='same', kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation(activation_type))
model.add(Conv2D(64, (3,3), padding='same', kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation(activation_type))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.3))
print (bias.shape)
model.add(Conv2D(128, (3,3), padding='same', kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation(activation_type))
model.add(Conv2D(128, (3,3), padding='same', kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation(activation_type))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.4))
f = open(file_name, "wb")
for i in range(W):
f.write(bias[i])
f.close()
model.add(Flatten())
model.add(Dense(self.num_classes))
model.add(Activation('softmax'))
model.summary()
return model
def dumpLabels(file_name, Y_test):
f = open(file_name, "wb")
labels_map = {}
for label in Y_test:
label_val = np.int8(label[0])
if label_val not in labels_map:
labels_map[label_val] = 0
labels_map[label_val] += 1
f.write(label_val)
def trainModel(self, model):
f.close()
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
def dumpData(X_test, file_name, N, C, H, W):
test_labels = y_test
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
print (X_test.shape)
f = open(file_name, "wb")
for i in range(N):
for j in range(C):
for k in range(H):
for l in range(W):
val = struct.unpack("f", struct.pack("f", X_test[i][j][k][l]))
f.write(np.float32(val[0]))
#z-score
mean = np.mean(x_train,axis=(0,1,2,3))
std = np.std(x_train,axis=(0,1,2,3))
x_train = (x_train-mean)/(std+1e-7)
x_test = (x_test-mean)/(std+1e-7)
f.close()
y_train = np_utils.to_categorical(y_train, self.num_classes)
y_test = np_utils.to_categorical(y_test, self.num_classes)
#data augmentation
datagen = ImageDataGenerator(
rotation_range=15,
width_shift_range=0.1,
height_shift_range=0.1,
horizontal_flip=True,
)
datagen.fit(x_train)
#training
batch_size = 64
opt_rms = keras.optimizers.rmsprop(lr=0.001,decay=1e-6)
model.compile(loss='categorical_crossentropy', optimizer=opt_rms, metrics=['accuracy'])
def lr_schedule(epoch):
lrate = 0.001
if epoch > 75:
lrate = 0.0005
if epoch > 100:
lrate = 0.0003
return lrate
model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size),\
steps_per_epoch=x_train.shape[0] // batch_size, #epochs=350,\
epochs=3,
verbose=1,validation_data=(x_test,y_test), \
callbacks=[LearningRateScheduler(self.lr_schedule2)])
return model
def lr_schedule2(epoch):
lrate = 0.0005
if epoch > 100:
lrate = 0.0003
if epoch > 200:
lrate = 0.0002
if epoch > 250:
lrate = 0.0001
if epoch > 300:
lrate = 0.00003
return lrate
def data_preprocess(self):
K.set_image_data_format('channels_first')
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
test_labels = y_test
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
#z-score
mean = np.mean(x_train,axis=(0,1,2,3))
std = np.std(x_train,axis=(0,1,2,3))
x_train = (x_train-mean)/(std+1e-7)
x_test = (x_test-mean)/(std+1e-7)
#z-score
mean = np.mean(x_train,axis=(0,1,2,3))
std = np.std(x_train,axis=(0,1,2,3))
x_train = (x_train-mean)/(std+1e-7)
x_test = (x_test-mean)/(std+1e-7)
# Dumping test data and test labels
dir_prefix = "/home/hsharif3/Gitlab/hpvm/llvm/projects/hpvm-tensor-rt/model_params/alexnet2_cifar10/"
dumpLabels(dir_prefix + "test_labels.bin", y_test)
dumpData(x_test, dir_prefix + "norm_cifar_input.bin", 10000, 3, 32, 32)
num_classes = 10
y_train = np_utils.to_categorical(y_train,num_classes)
y_test = np_utils.to_categorical(y_test,num_classes)
weight_decay = 1e-4
activation_type = 'tanh'
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
model = Sequential()
model.add(Conv2D(32, (3,3), padding='same', kernel_regularizer=regularizers.l2(weight_decay), input_shape=x_train.shape[1:]))
model.add(Activation(activation_type))
#model.add(BatchNormalization())
model.add(Conv2D(32, (3,3), padding='same', kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation(activation_type))
#model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))
model.add(Conv2D(64, (3,3), padding='same', kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation(activation_type))
#model.add(BatchNormalization())
model.add(Conv2D(64, (3,3), padding='same', kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation(activation_type))
#model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.3))
model.add(Conv2D(128, (3,3), padding='same', kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation(activation_type))
#model.add(BatchNormalization())
model.add(Conv2D(128, (3,3), padding='same', kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation(activation_type))
#model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.4))
model.add(Flatten())
model.add(Dense(num_classes))
model.add(Activation('softmax'))
model.summary()
#data augmentation
datagen = ImageDataGenerator(
rotation_range=15,
width_shift_range=0.1,
height_shift_range=0.1,
horizontal_flip=True,
)
datagen.fit(x_train)
#training
batch_size = 64
opt_rms = keras.optimizers.rmsprop(lr=0.001,decay=1e-6)
model.compile(loss='categorical_crossentropy', optimizer=opt_rms, metrics=['accuracy'])
model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size),\
steps_per_epoch=x_train.shape[0] // batch_size, #epochs=350,\
epochs=1,
verbose=1,validation_data=(x_test,y_test),callbacks=[LearningRateScheduler(lr_schedule2)])
#save to disk
model_json = model.to_json()
with open('model.json', 'w') as json_file:
json_file.write(model_json)
model.save_weights('model.h5')
return x_train, y_train, x_test, y_test
#testing
scores = model.evaluate(x_test, y_test, batch_size=128, verbose=1)
print('\nTest result: %.3f loss: %.3f' % (scores[1]*100,scores[0]))
translate_to_approxhpvm(model, "alexnet2_cifar10_test/", x_test, test_labels, "alexnet2_cifar10/", y_test)
sys.exit(0)
if __name__ == "__main__":
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
# Changing to NCHW format
K.set_image_data_format('channels_first')
params = model.get_weights()
dumpConvWeights(dir_prefix + "conv1.bin", params[0], 32, 3, 3, 3)
dumpFcBias(dir_prefix + "conv1_bias.bin", params[1], 32)
dumpConvWeights(dir_prefix + "conv2.bin", params[2], 32, 32, 3, 3)
dumpFcBias(dir_prefix + "conv2_bias.bin", params[3], 32)
dumpConvWeights(dir_prefix + "conv3.bin", params[4], 64, 32, 3, 3)
dumpFcBias(dir_prefix + "conv3_bias.bin", params[5], 64)
dumpConvWeights(dir_prefix + "conv4.bin", params[6], 64, 64, 3, 3)
dumpFcBias(dir_prefix + "conv4_bias.bin", params[7], 64)
dumpConvWeights(dir_prefix + "conv5.bin", params[8], 128, 64, 3, 3)
dumpFcBias(dir_prefix + "conv5_bias.bin", params[9], 128)
dumpConvWeights(dir_prefix + "conv6.bin", params[10], 128, 128, 3, 3)
dumpFcBias(dir_prefix + "conv6_bias.bin", params[11], 128)
dumpFcWeights(dir_prefix + "fc1.bin", params[12], 2048, 10)
dumpFcBias(dir_prefix + "fc1_bias.bin", params[13], 10)
### Parameters specific to each benchmark
reload_dir = "/home/hsharif3/Gitlab/hpvm/llvm/projects/hpvm-tensor-rt/model_params/alexnet2_cifar10/"
keras_model_file = "alexnet2.h5"
hpvm_dir = "data/alexnet2_cifar10/"
num_classes = 10
alexnet2 = AlexNet2("AlexNet2", reload_dir, keras_model_file, hpvm_dir, num_classes)
alexnet2.run(sys.argv)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment