Skip to content
Snippets Groups Projects
lenet.py 3.23 KiB
import os
import sys
import glob

import numpy as np
import tensorflow as tf
import scipy
import scipy.io
import keras
from keras.models import Model, Sequential
from keras.layers import *
from keras.optimizers import Adam
from keras import regularizers
from keras import backend as K
from keras.utils import to_categorical
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import LearningRateScheduler

from keras.datasets import mnist
from Benchmark import Benchmark
from Config import MODEL_PARAMS_DIR



class LeNet_MNIST(Benchmark):

    def buildModel(self):

        # Network Compostion: 2 Conv Layers, 2 Dense Layers
        model = Sequential()

        # ConvLayer1
        model.add(Conv2D(32, kernel_size=(5, 5), padding='same', activation='tanh', input_shape=(1, 28, 28)))
        model.add(MaxPooling2D(pool_size=(2, 2)))

        # ConvLayer2
        model.add(Conv2D(64, (5, 5), activation='tanh', padding='same'))
        model.add(MaxPooling2D(pool_size=(2, 2)))

        model.add(Flatten())
        
        # DenseLayer1
        model.add(Dense(1024, activation='tanh'))
        # DenseLayer2
        
        model.add(Dense(self.num_classes, activation='tanh'))
        # Softmax Layer
        model.add(Activation('softmax'))

        return model


    def data_preprocess(self):
        (X_train, y_train), (X_val, y_val) = mnist.load_data()
        test_labels = y_val

        X_train = X_train.reshape(X_train.shape[0], 1, 28, 28)
        X_train = X_train.astype('float32')
        X_train /= 255

        X_test = np.fromfile(MODEL_PARAMS_DIR + '/lenet_mnist/test_input.bin', dtype=np.float32)
        X_test = X_test.reshape((-1, 1, 28, 28)) 
        y_test = np.fromfile(MODEL_PARAMS_DIR + '/lenet_mnist/test_labels.bin', dtype=np.uint32)
        
        X_tuner = np.fromfile(MODEL_PARAMS_DIR + '/lenet_mnist/tune_input.bin', dtype=np.float32)
        X_tuner = X_tuner.reshape((-1, 1, 28, 28)) 
        y_tuner = np.fromfile(MODEL_PARAMS_DIR + '/lenet_mnist/tune_labels.bin', dtype=np.uint32)

        return X_train, y_train, X_test, y_test, X_tuner, y_tuner
    

    def trainModel(self, model, X_train, y_train, X_test, y_test):

        y_train = to_categorical(y_train, self.num_classes)
        y_test = to_categorical(y_test, self.num_classes)
        
        model.compile(
            loss='categorical_crossentropy',
            optimizer=keras.optimizers.Adadelta(),
            metrics=['accuracy']
        )

        model.fit(
            X_train, 
            y_train,
            batch_size=128,
            epochs=10,
            verbose=1,
            validation_data=(X_test, y_test)
        )
        
        return model
  

    
if __name__ == '__main__':
      
    os.environ['CUDA_VISIBLE_DEVICES'] = '0'
    # Changing to NCHW format
    K.set_image_data_format('channels_first')


    ### Parameters specific to each benchmark
    reload_dir = MODEL_PARAMS_DIR + '/lenet_mnist/'
    keras_model_file = MODEL_PARAMS_DIR + '/lenet_mnist/weights.h5'
    data_dir = '' 
    src_dir = 'data/lenet_mnist_src/'
    num_classes = 10
    batch_size = 500
    
    print (reload_dir)

    model = LeNet_MNIST('LeNet_MNIST', reload_dir, keras_model_file, data_dir, src_dir, num_classes, batch_size)
    
    model.run(sys.argv)