def run(LEARNING_RATE=0.04,  UPDATE_MOMENTUM=0.9,UPDATE_RHO=None, NUM_OF_EPOCH=50, OUTPUT_SIZE = 20 , input_width=300, input_height=140,
                    dataset='ISH.pkl.gz', TRAIN_VALIDATION_SPLIT=0.2, #activation=lasagne.nonlinearities.tanh, #rectify
                    NUM_UNITS_HIDDEN_LAYER=[5, 10, 20, 40], BATCH_SIZE=40, toShuffleInput = False , withZeroMeaning = False):
    
    global counter
    FILE_PREFIX =  os.path.split(dataset)[1][:-6] #os.path.split(__file__)[1][:-3]
    FOLDER_PREFIX = "results/"+FILE_PREFIX+"/run_"+str(counter)+"/"
    if not os.path.exists(FOLDER_PREFIX):
        os.makedirs(FOLDER_PREFIX)
    
    PARAMS_FILE_NAME = FOLDER_PREFIX + "parameters.txt"
    HIDDEN_LAYER_OUTPUT_FILE_NAME = FOLDER_PREFIX +"hiddenLayerOutput.pickle"
    FIG_FILE_NAME = FOLDER_PREFIX + "fig"
    PICKLES_NET_FILE_NAME = FOLDER_PREFIX + "picklesNN.pickle"
    SVM_FILE_NAME = FOLDER_PREFIX + "svmData.txt"
#     VALIDATION_FILE_NAME = "results/"+os.path.split(__file__)[1][:-3]+"_validation_"+str(counter)+".txt"
#     PREDICTION_FILE_NAME = "results/"+os.path.split(__file__)[1][:-3]+"_prediction.txt"
    counter +=1

    outputFile = open(PARAMS_FILE_NAME, "w")   
    
    def load2d(dataset='ISH.pkl.gz', toShuffleInput = False , withZeroMeaning = False):
        print 'loading data...'   
    
        datasets = load_data(dataset, toShuffleInput, withZeroMeaning)
    
        train_set_x, train_set_y = datasets[0]
    #     valid_set_x, valid_set_y = datasets[1]
        test_set_x, test_set_y = datasets[2]
        
        train_set_x = train_set_x.reshape(-1, 1, input_width, input_height)
#         valid_set_x = valid_set_x.reshape(-1, 1, input_width, input_height)
        test_set_x = test_set_x.reshape(-1, 1, input_width, input_height)

        print(train_set_x.shape[0], 'train samples')
        return train_set_x, train_set_y, test_set_x, test_set_y 

    def createNNwithMomentom(input_height, input_width):
        net2 = NeuralNet(layers=[
                ('input', layers.InputLayer), 
                ('conv1', layers.Conv2DLayer), 
                ('pool1', layers.MaxPool2DLayer), 
                ('conv2', layers.Conv2DLayer), 
                ('pool2', layers.MaxPool2DLayer), 
                ('conv3', layers.Conv2DLayer), 
                ('pool3', layers.MaxPool2DLayer), 
                ('conv4', layers.Conv2DLayer), 
                ('pool4', layers.MaxPool2DLayer), 
                ('hidden5', layers.DenseLayer), 
                ('hidden6', layers.DenseLayer), 
                ('hidden7', layers.DenseLayer), 
                ('output', layers.DenseLayer)], 
            input_shape=(None, 1, input_width, input_height), 
            conv1_num_filters=NUM_UNITS_HIDDEN_LAYER[0], conv1_filter_size=(5, 5), pool1_pool_size=(2, 2), 
            conv2_num_filters=NUM_UNITS_HIDDEN_LAYER[1], conv2_filter_size=(9, 9), pool2_pool_size=(2, 2), 
            conv3_num_filters=NUM_UNITS_HIDDEN_LAYER[2], conv3_filter_size=(11, 11), pool3_pool_size=(4, 2), 
            conv4_num_filters=NUM_UNITS_HIDDEN_LAYER[3], conv4_filter_size=(8, 5), pool4_pool_size=(2, 2), 
            hidden5_num_units=500, hidden6_num_units=200, hidden7_num_units=100, 
            output_num_units=20, output_nonlinearity=None, 
            update_learning_rate=LEARNING_RATE, 
            update_momentum=UPDATE_MOMENTUM,
            update=nesterov_momentum, 
            train_split=TrainSplit(eval_size=TRAIN_VALIDATION_SPLIT), 
            batch_iterator_train=BatchIterator(batch_size=BATCH_SIZE), 
            regression=True, 
            max_epochs=NUM_OF_EPOCH, 
            verbose=1, 
            hiddenLayer_to_output=-2)
    #         on_training_finished=last_hidden_layer,
        return net2
    
    def createNNwithDecay(input_height, input_width):
        net2 = NeuralNet(layers=[
                ('input', layers.InputLayer), 
                ('conv1', layers.Conv2DLayer), 
                ('pool1', layers.MaxPool2DLayer), 
                ('conv2', layers.Conv2DLayer), 
                ('pool2', layers.MaxPool2DLayer), 
                ('conv3', layers.Conv2DLayer), 
                ('pool3', layers.MaxPool2DLayer), 
                ('conv4', layers.Conv2DLayer), 
                ('pool4', layers.MaxPool2DLayer), 
                ('hidden5', layers.DenseLayer), 
                ('hidden6', layers.DenseLayer), 
                ('hidden7', layers.DenseLayer), 
                ('output', layers.DenseLayer)], 
            input_shape=(None, 1, input_width, input_height), 
            conv1_num_filters=NUM_UNITS_HIDDEN_LAYER[0], conv1_filter_size=(5, 5), pool1_pool_size=(2, 2), 
            conv2_num_filters=NUM_UNITS_HIDDEN_LAYER[1], conv2_filter_size=(9, 9), pool2_pool_size=(2, 2), 
            conv3_num_filters=NUM_UNITS_HIDDEN_LAYER[2], conv3_filter_size=(11, 11), pool3_pool_size=(4, 2), 
            conv4_num_filters=NUM_UNITS_HIDDEN_LAYER[3], conv4_filter_size=(8, 5), pool4_pool_size=(2, 2), 
            hidden5_num_units=500, hidden6_num_units=200, hidden7_num_units=100, 
            output_num_units=20, output_nonlinearity=None, 
            update_learning_rate=LEARNING_RATE, 
            update_rho=UPDATE_RHO, 
            update=rmsprop, 
            train_split=TrainSplit(eval_size=TRAIN_VALIDATION_SPLIT), 
            batch_iterator_train=BatchIterator(batch_size=BATCH_SIZE), 
            regression=True, 
            max_epochs=NUM_OF_EPOCH, 
            verbose=1, 
            hiddenLayer_to_output=-2)
    #         on_training_finished=last_hidden_layer,
        return net2
  
    def last_hidden_layer(s, h):
        
        print s.output_last_hidden_layer_(X)
#         input_layer = s.get_all_layers()[0]
#         last_h_layer = s.get_all_layers()[-2]
#         f = theano.function(s.X_inputs, last_h_layer.get_output(last_h_layer),allow_input_downcast=True)
 
#         myFunc = theano.function(
#                     inputs=s.input_X,
#                     outputs=s.h_predict,
#                     allow_input_downcast=True,
#                     )
#         print s.output_last_hidden_layer_(X,-2)

    def writeOutputFile(outputFile,train_history,layer_info):
        # save the network's parameters
        outputFile.write("Validation set Prediction rate is: "+str((1-train_history[-1]['valid_accuracy'])*100) + "%\n")
        outputFile.write("Run time[minutes] is: "+str(run_time) + "\n\n")
        
        outputFile.write("Learning rate: " + str(LEARNING_RATE) + "\n")
        outputFile.write("Momentum: " + str(UPDATE_MOMENTUM) + "\n") if (UPDATE_RHO == None) else outputFile.write("Decay Factor: " + str(UPDATE_RHO) + "\n")
        outputFile.write("Batch size: " + str(BATCH_SIZE) + "\n")
        outputFile.write("Num epochs: " + str(NUM_OF_EPOCH) + "\n")
        outputFile.write("Num units hidden layers: " + str(NUM_UNITS_HIDDEN_LAYER) + "\n")
#         outputFile.write("activation func: " + str(activation) + "\n")
        outputFile.write("Train/validation split: " + str(TRAIN_VALIDATION_SPLIT) + "\n")
        outputFile.write("toShuffleInput: " + str(toShuffleInput) + "\n")
        outputFile.write("withZeroMeaning: " + str(withZeroMeaning) + "\n\n")
        
        outputFile.write("history: " + str(train_history) + "\n\n")
        outputFile.write("layer_info:\n" + str(layer_info) + "\n")

    start_time = time.clock()
       
    
    net2 = createNNwithMomentom(input_height, input_width) if UPDATE_RHO == None else createNNwithDecay(input_height, input_width)   
    
    
    X, y, test_x, test_y  = load2d()  # load 2-d data
    net2.fit(X, y)       
    
    run_time = (time.clock() - start_time) / 60.
    

    print "outputing last hidden layer"
    train_last_hiddenLayer = net2.output_hiddenLayer(X)
    test_last_hiddenLayer = net2.output_hiddenLayer(test_x)
#     ohlFile = open(HIDDEN_LAYER_OUTPUT_FILE_NAME+".txt", "w")
#     for line in train_last_hiddenLayer:
#         ohlFile.write(str(line) + "\n")  
    with open(HIDDEN_LAYER_OUTPUT_FILE_NAME,'wb') as f:
        ob = (train_last_hiddenLayer,y,test_last_hiddenLayer,test_y)
        pickle.dump(ob, f, -1)
        f.close()

    
    writeOutputFile(outputFile,net2.train_history_,PrintLayerInfo._get_layer_info_plain(net2))

    errorRates = runSvm(HIDDEN_LAYER_OUTPUT_FILE_NAME)
    errorRate = np.average(errorRates)

    outputFile.write("\nSVM Total Prediction rate is: "+str(100-errorRate) + "\n\n")
    outputFile.write("SVM Error rate is:\n"+str(errorRates) + "\n")

    outputFile.close()

#     write svm data
#     writeDataToFile(HIDDEN_LAYER_OUTPUT_FILE_NAME,SVM_FILE_NAME)
    
    
    ##############################################
    train_loss = np.array([i["train_loss"] for i in net2.train_history_])
    valid_loss = np.array([i["valid_loss"] for i in net2.train_history_])
    pyplot.plot(train_loss, linewidth=3, label="train")
    pyplot.plot(valid_loss, linewidth=3, label="valid")
    pyplot.grid()
    pyplot.legend()
    pyplot.xlabel("epoch")
    pyplot.ylabel("loss")
    pyplot.ylim(1e-3, 1)
    pyplot.yscale("log")
    pyplot.savefig(FIG_FILE_NAME)
    
    #################################################
    # def plot_sample(x, y, axis):
    #     img = x.reshape(96, 96)
    #     axis.imshow(img, cmap='gray')
    #     axis.scatter(y[0::2] * 48 + 48, y[1::2] * 48 + 48, marker='x', s=10)
    # 
    # X, _ = load(test=True)
    # y_pred = net1.predict(X)
    # 
    # fig = pyplot.figure(figsize=(6, 6))
    # fig.subplots_adjust(
    #     left=0, right=1, bottom=0, top=1, hspace=0.05, wspace=0.05)
    # 
    # for i in range(16):
    #     ax = fig.add_subplot(4, 4, i + 1, xticks=[], yticks=[])
    #     plot_sample(X[i], y_pred[i], ax)
    # 
    # pyplot.show()
    
    ########## pickle the network ##########
    print "pickling"    
    with open(PICKLES_NET_FILE_NAME,'wb') as f:
        pickle.dump(net2, f, -1)
        f.close()
Пример #2
0
def run(LEARNING_RATE=0.04,  UPDATE_MOMENTUM=0.9, NUM_OF_EPOCH=50, OUTPUT_SIZE = 20 , input_width=300, input_height=140,
                    dataset='ISH.pkl.gz', TRAIN_VALIDATION_SPLIT=0.2, #activation=lasagne.nonlinearities.tanh, #rectify
                    NUM_UNITS_HIDDEN_LAYER=[5, 10, 20, 40], BATCH_SIZE=40, toShuffleInput = False , withZeroMeaning = False):
    
    global counter
    FILE_PREFIX =  os.path.split(dataset)[1][4:16] #os.path.split(__file__)[1][:-3]
    PARAMS_FILE_NAME = "results/"+FILE_PREFIX+"_parameters_"+str(counter)+".txt"
    FIG_FILE_NAME = "results/"+FILE_PREFIX+"_fig_"+str(counter)
    PICKLES_NET_FILE_NAME = "results/"+FILE_PREFIX+"_picklesNN_"+str(counter)+".pickle"
#     VALIDATION_FILE_NAME = "results/"+os.path.split(__file__)[1][:-3]+"_validation_"+str(counter)+".txt"
#     PREDICTION_FILE_NAME = "results/"+os.path.split(__file__)[1][:-3]+"_prediction.txt"
    counter +=1

    outputFile = open(PARAMS_FILE_NAME, "w")   
    
    def load2d(dataset='ISH.pkl.gz', toShuffleInput = False , withZeroMeaning = False):
        print 'loading data...'   
    
        datasets = load_data(dataset, toShuffleInput, withZeroMeaning)
    
        train_set_x, train_set_y = datasets[0]
    #     valid_set_x, valid_set_y = datasets[1]
    #     test_set_x, test_set_y = datasets[2]
        
        train_set_x = train_set_x.reshape(-1, 1, input_width, input_height)
        print(train_set_x.shape[0], 'train samples')
        return train_set_x, train_set_y


    def writeOutputFile(outputFile,train_history,layer_info):
        # save the network's parameters
        outputFile.write("error is: "+str(1-train_history[-1]['valid_accuracy']) + "\n")
        outputFile.write("time is: "+str(run_time) + "\n\n")
        
        outputFile.write("learning rate: " + str(LEARNING_RATE) + "\n")
        outputFile.write("momentum: " + str(UPDATE_MOMENTUM) + "\n")
        outputFile.write("batch size: " + str(BATCH_SIZE) + "\n")
        outputFile.write("num epochs: " + str(NUM_OF_EPOCH) + "\n")
        outputFile.write("num units hidden layers: " + str(NUM_UNITS_HIDDEN_LAYER) + "\n")
#         outputFile.write("activation func: " + str(activation) + "\n")
        outputFile.write("train/validation split: " + str(TRAIN_VALIDATION_SPLIT) + "\n")
        outputFile.write("toShuffleInput: " + str(toShuffleInput) + "\n")
        outputFile.write("withZeroMeaning: " + str(withZeroMeaning) + "\n\n")
        
        outputFile.write("history: " + str(train_history) + "\n\n")
        outputFile.write("layer_info:\n" + str(layer_info) + "\n")

    start_time = time.clock()
       
    
    net2 = NeuralNet(
        layers=[
            ('input', layers.InputLayer),
            ('conv1', layers.Conv2DLayer),
            ('pool1', layers.MaxPool2DLayer),
            ('conv2', layers.Conv2DLayer),
            ('pool2', layers.MaxPool2DLayer),
            ('conv3', layers.Conv2DLayer),
            ('pool3', layers.MaxPool2DLayer),
            ('conv4', layers.Conv2DLayer),
            ('pool4', layers.MaxPool2DLayer),
            ('hidden5', layers.DenseLayer),
            ('hidden6', layers.DenseLayer),
            ('hidden7', layers.DenseLayer),
            ('output', layers.DenseLayer),
            ],
        input_shape=(None, 1, input_width, input_height),
        conv1_num_filters=NUM_UNITS_HIDDEN_LAYER[0], conv1_filter_size=(5, 5), pool1_pool_size=(2, 2),
        conv2_num_filters=NUM_UNITS_HIDDEN_LAYER[1], conv2_filter_size=(9, 9), pool2_pool_size=(2, 2),
        conv3_num_filters=NUM_UNITS_HIDDEN_LAYER[2], conv3_filter_size=(11, 11), pool3_pool_size=(4, 2),
        conv4_num_filters=NUM_UNITS_HIDDEN_LAYER[3], conv4_filter_size=(8, 5), pool4_pool_size=(2, 2),
        hidden5_num_units=500, hidden6_num_units=200, hidden7_num_units=100,
        output_num_units=20, output_nonlinearity=None,
    
        update_learning_rate=LEARNING_RATE,
        update_momentum=UPDATE_MOMENTUM,
        train_split=TrainSplit(eval_size=TRAIN_VALIDATION_SPLIT),
        batch_iterator_train=BatchIterator(batch_size=BATCH_SIZE),
    
        regression=True,
        max_epochs=NUM_OF_EPOCH,
        verbose=1,
        )

    
    
    
    X, y = load2d()  # load 2-d data
    net2.fit(X, y)
       
    
    run_time = (time.clock() - start_time) / 60.
    
    writeOutputFile(outputFile,net2.train_history_,PrintLayerInfo._get_layer_info_plain(net2))

    # import numpy as np
    # np.sqrt(0.003255) * 48
    
    ##############################################
    train_loss = np.array([i["train_loss"] for i in net2.train_history_])
    valid_loss = np.array([i["valid_loss"] for i in net2.train_history_])
    pyplot.plot(train_loss, linewidth=3, label="train")
    pyplot.plot(valid_loss, linewidth=3, label="valid")
    pyplot.grid()
    pyplot.legend()
    pyplot.xlabel("epoch")
    pyplot.ylabel("loss")
    pyplot.ylim(1e-3, 1)
    pyplot.yscale("log")
    pyplot.savefig(FIG_FILE_NAME)
    
    #################################################
    # def plot_sample(x, y, axis):
    #     img = x.reshape(96, 96)
    #     axis.imshow(img, cmap='gray')
    #     axis.scatter(y[0::2] * 48 + 48, y[1::2] * 48 + 48, marker='x', s=10)
    # 
    # X, _ = load(test=True)
    # y_pred = net1.predict(X)
    # 
    # fig = pyplot.figure(figsize=(6, 6))
    # fig.subplots_adjust(
    #     left=0, right=1, bottom=0, top=1, hspace=0.05, wspace=0.05)
    # 
    # for i in range(16):
    #     ax = fig.add_subplot(4, 4, i + 1, xticks=[], yticks=[])
    #     plot_sample(X[i], y_pred[i], ax)
    # 
    # pyplot.show()
    
    ########## pickle the network ##########
    print "pickling"    
    with open(PICKLES_NET_FILE_NAME,'wb') as f:
        pickle.dump(net2, f, -1)
        f.close()
Пример #3
0
def run(loadedData=None,FOLDER_NAME="defualt",LEARNING_RATE=0.04, UPDATE_MOMENTUM=0.9, UPDATE_RHO=None, NUM_OF_EPOCH=15, input_width=300, input_height=140,
                    dataset='withOutDataSet', TRAIN_VALIDATION_SPLIT=0.2, MULTI_POSITIVES=20, dropout_percent=0.1, USE_NUM_CAT=20,end_index=16351, #activation=lasagne.nonlinearities.tanh, #rectify
                    NUM_UNITS_HIDDEN_LAYER=[5, 10, 20, 40], BATCH_SIZE=40, toShuffleInput = False , withZeroMeaning = False):
    
    global counter
#     FILE_PREFIX =  os.path.split(dataset)[1][:-6] #os.path.split(__file__)[1][:-3]
    FOLDER_PREFIX = "results/"+FOLDER_NAME+"/run_"+str(counter)+"/"
    if not os.path.exists(FOLDER_PREFIX):
        os.makedirs(FOLDER_PREFIX)
    
    PARAMS_FILE_NAME = FOLDER_PREFIX + "parameters.txt"
    HIDDEN_LAYER_OUTPUT_FILE_NAME = FOLDER_PREFIX +"hiddenLayerOutput.pkl.gz"
    FIG_FILE_NAME = FOLDER_PREFIX + "fig"
    PICKLES_NET_FILE_NAME = FOLDER_PREFIX + "picklesNN.pkl.gz"
    SVM_FILE_NAME = FOLDER_PREFIX + "svmData.txt"
#     VALIDATION_FILE_NAME = "results/"+os.path.split(__file__)[1][:-3]+"_validation_"+str(counter)+".txt"
#     PREDICTION_FILE_NAME = "results/"+os.path.split(__file__)[1][:-3]+"_prediction.txt"
    counter +=1

    outputFile = open(PARAMS_FILE_NAME, "w")   
    
 

    def createNNwithMomentom(input_height, input_width):
        if USE_NUM_CAT==20:
            outputLayerSize=20
        else:
            outputLayerSize=15
            
        net2 = NeuralNet(layers=[
                ('input', layers.InputLayer), 
                ('conv1', layers.Conv2DLayer), 
                ('pool1', layers.MaxPool2DLayer), 
                ('conv2', layers.Conv2DLayer), 
                ('pool2', layers.MaxPool2DLayer), 
                ('conv3', layers.Conv2DLayer), 
                ('pool3', layers.MaxPool2DLayer), 
                ('conv4', layers.Conv2DLayer), 
                ('pool4', layers.MaxPool2DLayer), 
                ('hidden5', layers.DenseLayer), 
                ('hidden6', layers.DenseLayer), 
                ('hidden7', layers.DenseLayer), 
                ('output', layers.DenseLayer)], 
            input_shape=(None, 1, input_width, input_height), 
            conv1_num_filters=NUM_UNITS_HIDDEN_LAYER[0], conv1_filter_size=(5, 5), pool1_pool_size=(2, 2), 
            conv2_num_filters=NUM_UNITS_HIDDEN_LAYER[1], conv2_filter_size=(9, 9), pool2_pool_size=(2, 2), 
            conv3_num_filters=NUM_UNITS_HIDDEN_LAYER[2], conv3_filter_size=(11, 11), pool3_pool_size=(4, 2), 
            conv4_num_filters=NUM_UNITS_HIDDEN_LAYER[3], conv4_filter_size=(8, 5), pool4_pool_size=(2, 2), 
            hidden5_num_units=500, hidden6_num_units=200, hidden7_num_units=100, 
            output_num_units=outputLayerSize, output_nonlinearity=None, 
            update_learning_rate=LEARNING_RATE, 
            update_momentum=UPDATE_MOMENTUM,
            update=nesterov_momentum, 
            train_split=TrainSplit(eval_size=TRAIN_VALIDATION_SPLIT), 
            batch_iterator_train=BatchIterator(batch_size=BATCH_SIZE), 
            regression=True, 
            max_epochs=NUM_OF_EPOCH, 
            verbose=1, 
            hiddenLayer_to_output=-2)
    #         on_training_finished=last_hidden_layer,
        return net2
    
    def createNNwithDecay(input_height, input_width):
        if USE_NUM_CAT==20:
            outputLayerSize=20
        else:
            outputLayerSize=15

        net2 = NeuralNet(layers=[
                ('input', layers.InputLayer), 
                ('conv1', layers.Conv2DLayer), 
                ('pool1', layers.MaxPool2DLayer), 
                ('conv2', layers.Conv2DLayer), 
                ('pool2', layers.MaxPool2DLayer), 
                ('conv3', layers.Conv2DLayer), 
                ('pool3', layers.MaxPool2DLayer), 
                ('conv4', layers.Conv2DLayer), 
                ('pool4', layers.MaxPool2DLayer), 
                ('hidden5', layers.DenseLayer), 
                ('hidden6', layers.DenseLayer), 
                ('hidden7', layers.DenseLayer), 
                ('output', layers.DenseLayer)], 
            input_shape=(None, 1, input_width, input_height), 
            conv1_num_filters=NUM_UNITS_HIDDEN_LAYER[0], conv1_filter_size=(5, 5), pool1_pool_size=(2, 2), 
            conv2_num_filters=NUM_UNITS_HIDDEN_LAYER[1], conv2_filter_size=(9, 9), pool2_pool_size=(2, 2), 
            conv3_num_filters=NUM_UNITS_HIDDEN_LAYER[2], conv3_filter_size=(11, 11), pool3_pool_size=(4, 2), 
            conv4_num_filters=NUM_UNITS_HIDDEN_LAYER[3], conv4_filter_size=(8, 5), pool4_pool_size=(2, 2), 
            hidden5_num_units=500, hidden6_num_units=200, hidden7_num_units=100, 
            output_num_units=outputLayerSize, output_nonlinearity=None, 
            update_learning_rate=LEARNING_RATE, 
            update_rho=UPDATE_RHO, 
            update=rmsprop, 
            train_split=TrainSplit(eval_size=TRAIN_VALIDATION_SPLIT), 
            batch_iterator_train=BatchIterator(batch_size=BATCH_SIZE), 
            regression=True, 
            max_epochs=NUM_OF_EPOCH, 
            verbose=1, 
            hiddenLayer_to_output=-2)
    #         on_training_finished=last_hidden_layer,
        return net2
  
    def last_hidden_layer(s, h):
        
        print s.output_last_hidden_layer_(X)
#         input_layer = s.get_all_layers()[0]
#         last_h_layer = s.get_all_layers()[-2]
#         f = theano.function(s.X_inputs, last_h_layer.get_output(last_h_layer),allow_input_downcast=True)
 
#         myFunc = theano.function(
#                     inputs=s.input_X,
#                     outputs=s.h_predict,
#                     allow_input_downcast=True,
#                     )
#         print s.output_last_hidden_layer_(X,-2)

    def outputLastLayer_CNN(net2, X, y, test_x, test_y):
        print "outputing last hidden layer" #     train_last_hiddenLayer = net2.output_hiddenLayer(X)
        quarter_x = np.floor(X.shape[0] / 4)
        train_last_hiddenLayer1 = net2.output_hiddenLayer(X[:quarter_x])
        print "after first quarter train output"
        train_last_hiddenLayer2 = net2.output_hiddenLayer(X[quarter_x:2 * quarter_x])
        print "after seconed quarter train output"
        train_last_hiddenLayer3 = net2.output_hiddenLayer(X[2 * quarter_x:3 * quarter_x])
        print "after third quarter train output"
        train_last_hiddenLayer4 = net2.output_hiddenLayer(X[3 * quarter_x:])
        print "after all train output"
        test_last_hiddenLayer = net2.output_hiddenLayer(test_x)
        print "after test output" #     lastLayerOutputs = (train_last_hiddenLayer,y,test_last_hiddenLayer,test_y)
        lastLayerOutputs = np.concatenate((train_last_hiddenLayer1, train_last_hiddenLayer2, train_last_hiddenLayer3, train_last_hiddenLayer4), axis=0), y, test_last_hiddenLayer, test_y
        return lastLayerOutputs

    def writeOutputFile(outputFile,train_history,layer_info):
        # save the network's parameters
        outputFile.write("Validation set Prediction rate is: "+str((1-train_history[-1]['valid_accuracy'])*100) + "%\n")
        outputFile.write("Run time[minutes] is: "+str(run_time) + "\n\n")
        
        outputFile.write("Training NN on: " + ("20 Top Categorys\n" if USE_NUM_CAT==20 else "Article Categorys\n"))
        outputFile.write("Learning rate: " + str(LEARNING_RATE) + "\n")
        outputFile.write(("Momentum: " + str(UPDATE_MOMENTUM)+ "\n") if (UPDATE_RHO == None) else ("Decay Factor: " + str(UPDATE_RHO)+ "\n") )
        outputFile.write("Batch size: " + str(BATCH_SIZE) + "\n")
        outputFile.write("Num epochs: " + str(NUM_OF_EPOCH) + "\n")
        outputFile.write("Num units hidden layers: " + str(NUM_UNITS_HIDDEN_LAYER) + "\n\n")
#         outputFile.write("activation func: " + str(activation) + "\n")
        outputFile.write("Multipuly Positives by: " + str(MULTI_POSITIVES) + "\n")
        outputFile.write("New Positives Dropout rate: " + str(dropout_percent) + "\n")
        outputFile.write("Train/validation split: " + str(TRAIN_VALIDATION_SPLIT) + "\n")
        outputFile.write("toShuffleInput: " + str(toShuffleInput) + "\n")
        outputFile.write("withZeroMeaning: " + str(withZeroMeaning) + "\n\n")
        
        outputFile.write("history: " + str(train_history) + "\n\n")
        outputFile.write("layer_info:\n" + str(layer_info) + "\n")
        
        outputFile.flush()
        
        
    start_time = time.clock()
    print "Start time: " , time.ctime()
       
    
    net2 = createNNwithMomentom(input_height, input_width) if UPDATE_RHO == None else createNNwithDecay(input_height, input_width)   
    
    if loadedData is None:
    
        X, y, test_x, test_y  = load2d(USE_NUM_CAT,outputFile,input_width,input_height,end_index,MULTI_POSITIVES,dropout_percent)  # load 2-d data
    else:
        X, y, test_x, test_y = loadedData
    
    net2.fit(X, y)       

    run_time = (time.clock() - start_time) / 60.
    
    writeOutputFile(outputFile,net2.train_history_,PrintLayerInfo._get_layer_info_plain(net2))

    lastLayerOutputs = outputLastLayer_CNN(net2, X, y, test_x, test_y)

    
    
    print "running Category Classifier"    
    errorRates, aucScores = runSvm(lastLayerOutputs,15) #HIDDEN_LAYER_OUTPUT_FILE_NAME,15)
#     errorRates, aucScores = runCrossSvm(lastLayerOutputs,15)
#     errorRates, aucScores = runNNclassifier(lastLayerOutputs,15)

    errorRate = np.average(errorRates)
    aucScore = np.average(aucScores)
    
    
    outputFile.write("\nClassifiers Total Prediction rate is: "+str(100-errorRate) + "\n\n")
    outputFile.write("Classifiers Error rates are:\n"+str(errorRates) + "\n")
    outputFile.write("\nClassifiers Total AUC Score is: "+str(aucScore) + "\n\n")
    outputFile.write("Classifiers AUC Scores are:\n"+str(aucScores) + "\n")
    outputFile.close()
    
    print "saving last layer outputs"
#     with open(HIDDEN_LAYER_OUTPUT_FILE_NAME,'wb') as f:
#         pickle.dump(lastLayerOutputs, f, -1)
#         f.close()
    f = gzip.open(HIDDEN_LAYER_OUTPUT_FILE_NAME,'wb')
    cPickle.dump(lastLayerOutputs, f, protocol=2)
    f.close() 

#     write svm data
#     writeDataToFile(HIDDEN_LAYER_OUTPUT_FILE_NAME,SVM_FILE_NAME)
    
    
    ##############################################
    train_loss = np.array([i["train_loss"] for i in net2.train_history_])
    valid_loss = np.array([i["valid_loss"] for i in net2.train_history_])
    pyplot.plot(train_loss, linewidth=3, label="train")
    pyplot.plot(valid_loss, linewidth=3, label="valid")
    pyplot.grid()
    pyplot.legend()
    pyplot.xlabel("epoch")
    pyplot.ylabel("loss")
    pyplot.ylim(1e-3, 1)
    pyplot.yscale("log")
    pyplot.savefig(FIG_FILE_NAME)
    
    #################################################
    # def plot_sample(x, y, axis):
    #     img = x.reshape(96, 96)
    #     axis.imshow(img, cmap='gray')
    #     axis.scatter(y[0::2] * 48 + 48, y[1::2] * 48 + 48, marker='x', s=10)
    # 
    # X, _ = load(test=True)
    # y_pred = net1.predict(X)
    # 
    # fig = pyplot.figure(figsize=(6, 6))
    # fig.subplots_adjust(
    #     left=0, right=1, bottom=0, top=1, hspace=0.05, wspace=0.05)
    # 
    # for i in range(16):
    #     ax = fig.add_subplot(4, 4, i + 1, xticks=[], yticks=[])
    #     plot_sample(X[i], y_pred[i], ax)
    # 
    # pyplot.show()
    
    ########## pickle the network ##########
    print "pickling"    
#     with open(PICKLES_NET_FILE_NAME,'wb') as f:
#         pickle.dump(net2, f, -1)
#         f.close()
    f = gzip.open(PICKLES_NET_FILE_NAME,'wb')
    cPickle.dump(net2, f, protocol=2)
    f.close()
Пример #4
0
def run(loadedData=None, learning_rate=0.04, update_momentum=0.9, update_rho=None, epochs=15,
        input_width=300, input_height=140, train_valid_split=0.2, multiple_positives=20, flip_batch=True,
        dropout_percent=0.1, end_index=16351, activation=None, last_layer_activation=None, batch_size=32,
        layers_size=[5, 10, 20, 40], shuffle_input=False, zero_meaning=False, filters_type=3,
        input_noise_rate=0.3, pre_train_epochs=1, softmax_train_epochs=2, fine_tune_epochs=2,
        categories=15, folder_name="default", dataset='withOutDataSet'):

    global counter
    folder_path = "results_dae"+FILE_SEPARATOR + folder_name + FILE_SEPARATOR + "run_" + str(counter) + FILE_SEPARATOR
    if not os.path.exists(folder_path):
        os.makedirs(folder_path)

    PARAMS_FILE_NAME = folder_path + "parameters.txt"
    HIDDEN_LAYER_OUTPUT_FILE_NAME = folder_path + "hiddenLayerOutput.pkl.gz"
    FIG_FILE_NAME = folder_path + "fig"
    PICKLES_NET_FILE_NAME = folder_path + "picklesNN.pkl.gz"
    SVM_FILE_NAME = folder_path + "svmData.txt"
    LOG_FILE_NAME = folder_path + "message.log"

    All_Results_FIle = "results_dae"+FILE_SEPARATOR + "all_results.txt"


    #     old_stdout = sys.stdout
    #     print "less",LOG_FILE_NAME
    log_file = open(LOG_FILE_NAME, "w")
    #     sys.stdout = log_file

    counter += 1

    output_file = open(PARAMS_FILE_NAME, "w")
    results_file = open(All_Results_FIle, "a")

    if filters_type == 3:
        filter_1 = (3, 3)
        filter_2 = (3, 3)
        filter_3 = (3, 3)
        filter_4 = (3, 3)
        filter_5 = (3, 3)
        filter_6 = (3, 3)
    elif filters_type == 5:
        filter_1 = (5, 5)
        filter_2 = (5, 5)
        filter_3 = (5, 5)
        filter_4 = (5, 5)
        filter_5 = (5, 5)
        filter_6 = (5, 5)
    elif filters_type == 7:
        filter_1 = (7, 7)
        filter_2 = (7, 7)
        filter_3 = (5, 5)
        filter_4 = (7, 7)
        filter_5 = (7, 7)
        filter_6 = (5, 5)
    elif filters_type == 9:
        filter_1 = (9, 9)
        filter_2 = (7, 7)
        filter_3 = (5, 5)
        filter_4 = (7, 7)
        filter_5 = (9, 9)
        filter_6 = (5, 5)

    def createCSAE(input_height, input_width, X_train, X_out):

        X_train = np.random.binomial(1, 1-dropout_percent, size=X_train.shape) * X_train

        cnn = NeuralNet(layers=[
            ('input', layers.InputLayer),
            ('conv1', layers.Conv2DLayer),
            ('conv11', layers.Conv2DLayer),
            # ('conv12', layers.Conv2DLayer),
            ('pool1', layers.MaxPool2DLayer),
            ('conv2', layers.Conv2DLayer),
            ('conv21', layers.Conv2DLayer),
            # ('conv22', layers.Conv2DLayer),
            ('pool2', layers.MaxPool2DLayer),
            ('conv3', layers.Conv2DLayer),
            # ('conv31', layers.Conv2DLayer),
            ('conv32', layers.Conv2DLayer),
            ('unpool1', Unpool2DLayer),
            ('conv4', layers.Conv2DLayer),
            ('conv41', layers.Conv2DLayer),
            # ('conv42', layers.Conv2DLayer),
            ('unpool2', Unpool2DLayer),
            ('conv5', layers.Conv2DLayer),
            ('conv51', layers.Conv2DLayer),
            # ('conv52', layers.Conv2DLayer),
            ('conv6', layers.Conv2DLayer),
            ('output_layer', ReshapeLayer),
        ],

            input_shape=(None, 1, input_width, input_height),
            # Layer current size - 1x300x140

            conv1_num_filters=layers_size[0], conv1_filter_size=filter_1, conv1_nonlinearity=activation,
            # conv1_border_mode="same",
            conv1_pad="same",
            conv11_num_filters=layers_size[0], conv11_filter_size=filter_1, conv11_nonlinearity=activation,
            # conv11_border_mode="same",
            conv11_pad="same",
            # conv12_num_filters=layers_size[0], conv12_filter_size=filter_1, conv12_nonlinearity=activation,
            # # conv12_border_mode="same",
            # conv12_pad="same",

            pool1_pool_size=(2, 2),

            conv2_num_filters=layers_size[1], conv2_filter_size=filter_2, conv2_nonlinearity=activation,
            # conv2_border_mode="same",
            conv2_pad="same",
            conv21_num_filters=layers_size[1], conv21_filter_size=filter_2, conv21_nonlinearity=activation,
            # conv21_border_mode="same",
            conv21_pad="same",
            # conv22_num_filters=layers_size[1], conv22_filter_size=filter_2, conv22_nonlinearity=activation,
            # # conv22_border_mode="same",
            # conv22_pad="same",

            pool2_pool_size=(2, 2),

            conv3_num_filters=layers_size[2], conv3_filter_size=filter_3, conv3_nonlinearity=activation,
            # conv3_border_mode="same",
            conv3_pad="same",
            # conv31_num_filters=layers_size[2], conv31_filter_size=filter_3, conv31_nonlinearity=activation,
            # # conv31_border_mode="same",
            # conv31_pad="same",
            conv32_num_filters=1, conv32_filter_size=filter_3, conv32_nonlinearity=activation,
            # conv32_border_mode="same",
            conv32_pad="same",

            unpool1_ds=(2, 2),

            conv4_num_filters=layers_size[3], conv4_filter_size=filter_4, conv4_nonlinearity=activation,
            # conv4_border_mode="same",
            conv4_pad="same",
            conv41_num_filters=layers_size[3], conv41_filter_size=filter_4, conv41_nonlinearity=activation,
            # conv41_border_mode="same",
            conv41_pad="same",
            # conv42_num_filters=layers_size[3], conv42_filter_size=filter_4, conv42_nonlinearity=activation,
            # # conv42_border_mode="same",
            # conv42_pad="same",

            unpool2_ds=(2, 2),

            conv5_num_filters=layers_size[4], conv5_filter_size=filter_5, conv5_nonlinearity=activation,
            # conv5_border_mode="same",
            conv5_pad="same",
            conv51_num_filters=layers_size[4], conv51_filter_size=filter_5, conv51_nonlinearity=activation,
            # conv51_border_mode="same",
            conv51_pad="same",
            # conv52_num_filters=layers_size[4], conv52_filter_size=filter_5, conv52_nonlinearity=activation,
            # # conv52_border_mode="same",
            # conv52_pad="same",

            conv6_num_filters=1, conv6_filter_size=filter_6, conv6_nonlinearity=last_layer_activation,
            # conv6_border_mode="same",
            conv6_pad="same",

            output_layer_shape=(([0], -1)),

            update_learning_rate=learning_rate,
            update_momentum=update_momentum,
            update=nesterov_momentum,
            train_split=TrainSplit(eval_size=train_valid_split),
            batch_iterator_train=FlipBatchIterator(batch_size=batch_size) if flip_batch else BatchIterator(batch_size=batch_size),
            regression=True,
            max_epochs=epochs,
            verbose=1,
            hiddenLayer_to_output=-9)

        cnn.fit(X_train, X_out)

        try:
            pickle.dump(cnn, open(folder_path + 'conv_ae.pkl', 'w'))
            # cnn = pickle.load(open(folder_path + 'conv_ae.pkl','r'))
            cnn.save_weights_to(folder_path + 'conv_ae.np')
        except:
            print ("Could not pickle cnn")

        X_pred = cnn.predict(X_train).reshape(-1, input_height, input_width) # * sigma + mu
        # # X_pred = np.rint(X_pred).astype(int)
        # # X_pred = np.clip(X_pred, a_min=0, a_max=255)
        # # X_pred = X_pred.astype('uint8')
        #
        # try:
        #     trian_last_hiddenLayer = cnn.output_hiddenLayer(X_train)
        #     # test_last_hiddenLayer = cnn.output_hiddenLayer(test_x)
        #     pickle.dump(trian_last_hiddenLayer, open(folder_path + 'encode.pkl', 'w'))
        # except:
        #     print "Could not save encoded images"

        print ("Saving some images....")
        for i in range(10):
            index = np.random.randint(train_x.shape[0])
            print (index)

            def get_picture_array(X, index):
                array = np.rint(X[index] * 256).astype(np.int).reshape(input_height, input_width)
                array = np.clip(array, a_min=0, a_max=255)
                return array.repeat(4, axis=0).repeat(4, axis=1).astype(np.uint8())

            original_image = Image.fromarray(get_picture_array(X_out, index))
            # original_image.save(folder_path + 'original' + str(index) + '.png', format="PNG")
            #
            # array = np.rint(trian_last_hiddenLayer[index] * 256).astype(np.int).reshape(input_height/2, input_width/2)
            # array = np.clip(array, a_min=0, a_max=255)
            # encode_image = Image.fromarray(array.repeat(4, axis=0).repeat(4, axis=1).astype(np.uint8()))
            # encode_image.save(folder_path + 'encode' + str(index) + '.png', format="PNG")

            new_size = (original_image.size[0] * 3, original_image.size[1])
            new_im = Image.new('L', new_size)
            new_im.paste(original_image, (0, 0))
            pred_image = Image.fromarray(get_picture_array(X_pred, index))
            # pred_image.save(folder_path + 'pred' + str(index) + '.png', format="PNG")
            new_im.paste(pred_image, (original_image.size[0], 0))

            noise_image = Image.fromarray(get_picture_array(X_train, index))
            new_im.paste(noise_image, (original_image.size[0]*2, 0))
            new_im.save(folder_path+'origin_prediction_noise-'+str(index)+'.png', format="PNG")

            # diff = ImageChops.difference(original_image, pred_image)
            # diff = diff.convert('L')
            # diff.save(folder_path + 'diff' + str(index) + '.png', format="PNG")

            # plt.imshow(new_im)
            # new_size = (original_image.size[0] * 2, original_image.size[1])
            # new_im = Image.new('L', new_size)
            # new_im.paste(original_image, (0, 0))
            # pred_image = Image.fromarray(get_picture_array(X_train, index))
            # # pred_image.save(folder_path + 'noisyInput' + str(index) + '.png', format="PNG")
            # new_im.paste(pred_image, (original_image.size[0], 0))
            # new_im.save(folder_path+'origin_VS_noise-'+str(index)+'.png', format="PNG")
            # plt.imshow(new_im)

        return cnn

    def createSAE(input_height, input_width, X_train, X_out):
        encode_size = 200

        cnn1 = NeuralNet(layers=[
            ('input', layers.InputLayer),
            ('hidden', layers.DenseLayer),
            ('hiddenOut', layers.DenseLayer),
            ('output_layer', ReshapeLayer),
        ],

            input_shape=(None, 1, input_width, input_height),
            hidden_num_units= 10000,
            hiddenOut_num_units= 42000,
            output_layer_shape = (([0], -1)),

            update_learning_rate=learning_rate,
            update_momentum=update_momentum,
            update=nesterov_momentum,
            train_split=TrainSplit(eval_size=train_valid_split),
            # batch_iterator_train=BatchIterator(batch_size=batch_size),
            batch_iterator_train=FlipBatchIterator(batch_size=batch_size),
            regression=True,
            max_epochs=epochs,
            verbose=1,
            hiddenLayer_to_output=-3)

        cnn1.fit(X_train, X_out)
        trian_last_hiddenLayer = cnn1.output_hiddenLayer(X_train)
        test_last_hiddenLayer = cnn1.output_hiddenLayer(test_x)

        cnn2 = NeuralNet(layers=[
            ('input', layers.InputLayer),
            ('hidden', layers.DenseLayer),
            ('output_layer', layers.DenseLayer),
        ],

            input_shape=(None,10000),
            hidden_num_units= 3000,
            output_layer_num_units = 10000,

            update_learning_rate=learning_rate,
            update_momentum=update_momentum,
            update=nesterov_momentum,
            train_split=TrainSplit(eval_size=train_valid_split),
            batch_iterator_train=BatchIterator(batch_size=batch_size),
            # batch_iterator_train=FlipBatchIterator(batch_size=batch_size),
            regression=True,
            max_epochs=epochs,
            verbose=1,
            hiddenLayer_to_output=-2)

        trian_last_hiddenLayer = trian_last_hiddenLayer.astype(np.float32)

        cnn2.fit(trian_last_hiddenLayer, trian_last_hiddenLayer)
        trian_last_hiddenLayer = cnn2.output_hiddenLayer(trian_last_hiddenLayer)
        test_last_hiddenLayer = cnn2.output_hiddenLayer(test_last_hiddenLayer)

        cnn3 = NeuralNet(layers=[
            ('input', layers.InputLayer),
            ('hidden', layers.DenseLayer),
            ('output_layer', layers.DenseLayer),
        ],

            input_shape=(None,3000),
            hidden_num_units= 1000,
            output_layer_num_units = 3000,

            update_learning_rate=learning_rate,
            update_momentum=update_momentum,
            update=nesterov_momentum,
            train_split=TrainSplit(eval_size=train_valid_split),
            batch_iterator_train=BatchIterator(batch_size=batch_size),
            # batch_iterator_train=FlipBatchIterator(batch_size=batch_size),
            regression=True,
            max_epochs=epochs,
            verbose=1,
            hiddenLayer_to_output=-2)

        trian_last_hiddenLayer = trian_last_hiddenLayer.astype(np.float32)
        cnn3.fit(trian_last_hiddenLayer, trian_last_hiddenLayer)
        trian_last_hiddenLayer = cnn3.output_hiddenLayer(trian_last_hiddenLayer)
        test_last_hiddenLayer = cnn3.output_hiddenLayer(test_last_hiddenLayer)

        cnn4 = NeuralNet(layers=[
            ('input', layers.InputLayer),
            ('hidden', layers.DenseLayer),
            ('output_layer', layers.DenseLayer),
        ],

            input_shape=(None,1000),
            hidden_num_units= 300,
            output_layer_num_units = 1000,

            update_learning_rate=learning_rate,
            update_momentum=update_momentum,
            update=nesterov_momentum,
            train_split=TrainSplit(eval_size=train_valid_split),
            batch_iterator_train=BatchIterator(batch_size=batch_size),
            # batch_iterator_train=FlipBatchIterator(batch_size=batch_size),
            regression=True,
            max_epochs=epochs,
            verbose=1,
            hiddenLayer_to_output=-2)

        trian_last_hiddenLayer = trian_last_hiddenLayer.astype(np.float32)
        cnn4.fit(trian_last_hiddenLayer, trian_last_hiddenLayer)
        trian_last_hiddenLayer = cnn4.output_hiddenLayer(trian_last_hiddenLayer)
        test_last_hiddenLayer = cnn4.output_hiddenLayer(test_last_hiddenLayer)


        input_layer = cnn1.get_all_layers()[0]
        hidden1_layer = cnn1.get_all_layers()[1]
        hidden1_layer.input_layer = input_layer
        hidden2_layer = cnn2.get_all_layers()[1]
        hidden2_layer.input_layer = hidden1_layer
        hidden3_layer = cnn3.get_all_layers()[1]
        hidden3_layer.input_layer = hidden2_layer
        final_layer = cnn4.get_all_layers()[1]
        final_layer.input_layer = hidden3_layer

        #         out_train = final_layer.get_output(x_train).eval()
        #         out_test = final_layer.get_output(test_x).eval()

        f = gzip.open(folder_path + "output.pkl.gz",'wb')
        cPickle.dump((trian_last_hiddenLayer, test_last_hiddenLayer), f, protocol=2)
        f.close()
        #         f = gzip.open("pickled_images/tmp.pkl.gz", 'rb')
        #         trian_last_hiddenLayer, test_last_hiddenLayer = cPickle.load(f)
        #         f.close()

        return cnn1

    def createCnn_AE(input_height, input_width):
        if categories==20:
            outputLayerSize=20
        else:
            outputLayerSize=15

        encode_size = 1024
        border_mode = "same"

        cnn = NeuralNet(layers=[
            ('input', layers.InputLayer),
            ('conv1', layers.Conv2DLayer),
            ('pool1', layers.MaxPool2DLayer),
            ('conv2', layers.Conv2DLayer),
            ('pool2', layers.MaxPool2DLayer),
            ('conv3', layers.Conv2DLayer),
            ('pool3', layers.MaxPool2DLayer),
            # ('conv4', layers.Conv2DLayer),
            # ('pool4', layers.MaxPool2DLayer),
            ('flatten', ReshapeLayer),  # output_dense
            ('encode_layer', layers.DenseLayer),
            ('hidden', layers.DenseLayer),  # output_dense
            ('unflatten', ReshapeLayer),
            # ('unpool4', Unpool2DLayer),
            # ('deconv4', layers.Conv2DLayer),
            ('unpool3', Unpool2DLayer),
            ('deconv3', layers.Conv2DLayer),
            ('unpool2', Unpool2DLayer),
            ('deconv2', layers.Conv2DLayer),
            ('unpool1', Unpool2DLayer),
            ('deconv1', layers.Conv2DLayer),
            ('output_layer', ReshapeLayer),

            # ('hidden5', layers.DenseLayer),
            # ('hidden6', layers.DenseLayer),
            # ('hidden7', layers.DenseLayer),
            # ('output', layers.DenseLayer)
        ],

            input_shape=(None, 1, input_width, input_height),
            # Layer current size - 1x300x140
            conv1_num_filters=layers_size[0], conv1_filter_size=(5, 5), conv1_border_mode="valid", conv1_nonlinearity=None,
            #Layer current size - NFx296x136
            pool1_pool_size=(2, 2),
            # Layer current size - NFx148x68
            conv2_num_filters=layers_size[1], conv2_filter_size=(5, 5), conv2_border_mode=border_mode, conv2_nonlinearity=None,
            # Layer current size - NFx148x68
            pool2_pool_size=(2, 2),
            # Layer current size - NFx74x34
            conv3_num_filters=layers_size[2], conv3_filter_size=(3, 3), conv3_border_mode=border_mode, conv3_nonlinearity=None,
            # Layer current size - NFx74x34
            pool3_pool_size=(2, 2),

            # conv4_num_filters=layers_size[3], conv4_filter_size=(5, 5), conv4_border_mode=border_mode, conv4_nonlinearity=None,
            # pool4_pool_size=(2, 2),

            # Layer current size - NFx37x17
            flatten_shape=(([0], -1)), # not sure if necessary?
            # Layer current size - NF*37*17
            encode_layer_num_units = encode_size,
            # Layer current size - 200
            hidden_num_units=layers_size[-1] * 37 * 17,
            # Layer current size - NF*37*17
            unflatten_shape=(([0], layers_size[-1], 37, 17)),

            # deconv4_num_filters=layers_size[3], deconv4_filter_size=(5, 5), deconv4_border_mode=border_mode, deconv4_nonlinearity=None,
            # unpool4_ds=(2, 2),

            # Layer current size - NFx37x17
            unpool3_ds=(2, 2),
            # Layer current size - NFx74x34
            deconv3_num_filters=layers_size[-2], deconv3_filter_size=(3, 3), deconv3_border_mode=border_mode, deconv3_nonlinearity=None,
            # Layer current size - NFx74x34
            unpool2_ds=(2, 2),
            # Layer current size - NFx148x68
            deconv2_num_filters=layers_size[-3], deconv2_filter_size=(5, 5), deconv2_border_mode=border_mode, deconv2_nonlinearity=None,
            # Layer current size - NFx148x68
            unpool1_ds=(2, 2),
            # Layer current size - NFx296x136
            deconv1_num_filters=1, deconv1_filter_size=(5, 5), deconv1_border_mode="full", deconv1_nonlinearity=None,
            # Layer current size - 1x300x140
            output_layer_shape = (([0], -1)),
            # Layer current size - 300*140

            # output_num_units=outputLayerSize, output_nonlinearity=None,
            update_learning_rate=learning_rate,
            update_momentum=update_momentum,
            update=nesterov_momentum,
            train_split=TrainSplit(eval_size=train_valid_split),
            # batch_iterator_train=BatchIterator(batch_size=batch_size),
            batch_iterator_train=FlipBatchIterator(batch_size=batch_size),
            regression=True,
            max_epochs=epochs,
            verbose=1,
            hiddenLayer_to_output=-10)
        # on_training_finished=last_hidden_layer,
        return cnn

    def createNNwithDecay(input_height, input_width):
        if categories==20:
            outputLayerSize=20
        else:
            outputLayerSize=15

        cnn = NeuralNet(layers=[
            ('input', layers.InputLayer),
            ('conv1', layers.Conv2DLayer),
            ('pool1', layers.MaxPool2DLayer),
            ('conv2', layers.Conv2DLayer),
            ('pool2', layers.MaxPool2DLayer),
            ('conv3', layers.Conv2DLayer),
            ('pool3', layers.MaxPool2DLayer),
            ('conv4', layers.Conv2DLayer),
            ('pool4', layers.MaxPool2DLayer),
            ('hidden5', layers.DenseLayer),
            ('hidden6', layers.DenseLayer),
            ('hidden7', layers.DenseLayer),
            ('output', layers.DenseLayer)],
            input_shape=(None, 1, input_width, input_height),
            conv1_num_filters=layers_size[0], conv1_filter_size=(5, 5), pool1_pool_size=(2, 2),
            conv2_num_filters=layers_size[1], conv2_filter_size=(9, 9), pool2_pool_size=(2, 2),
            conv3_num_filters=layers_size[2], conv3_filter_size=(11, 11), pool3_pool_size=(4, 2),
            conv4_num_filters=layers_size[3], conv4_filter_size=(8, 5), pool4_pool_size=(2, 2),
            hidden5_num_units=500, hidden6_num_units=200, hidden7_num_units=100,
            output_num_units=outputLayerSize, output_nonlinearity=None,
            update_learning_rate=learning_rate,
            update_rho=update_rho,
            update=rmsprop,
            train_split=TrainSplit(eval_size=train_valid_split),
            batch_iterator_train=BatchIterator(batch_size=batch_size),
            regression=True,
            max_epochs=epochs,
            verbose=1,
            hiddenLayer_to_output=-2)
        #         on_training_finished=last_hidden_layer,
        return cnn

    def last_hidden_layer(s, h):

        print s.output_last_hidden_layer_(train_x)
    #         input_layer = s.get_all_layers()[0]
    #         last_h_layer = s.get_all_layers()[-2]
    #         f = theano.function(s.X_inputs, last_h_layer.get_output(last_h_layer),allow_input_downcast=True)

    #         myFunc = theano.function(
    #                     inputs=s.input_X,
    #                     outputs=s.h_predict,
    #                     allow_input_downcast=True,
    #                     )
    #         print s.output_last_hidden_layer_(train_x,-2)

    def writeOutputFile(output_file, train_history, layer_info):
        # save the network's parameters
        output_file.write("Validation set error: " + str(train_history[-1]['valid_accuracy']) + "\n\n")
        results_file.write(str(train_history[-1]['valid_accuracy']) + "\t")

        output_file.write("Training NN on: " + ("20 Top Categories\n" if 20 == categories else "Article Categories\n"))
        output_file.write("Learning rate: " + str(learning_rate) + "\n")
        results_file.write(str(learning_rate) + "\t")
        output_file.write(("Momentum: " + str(update_momentum) + "\n") if update_rho is None else (
        "Decay Factor: " + str(update_rho) + "\n"))
        results_file.write(str(update_momentum) + "\t")
        output_file.write(("FlipBatcherIterater" if flip_batch else "BatchIterator") + " with batch: " + str(batch_size) + "\n")
        results_file.write("FlipBatcherIterater\t" + str(batch_size) + "\t")
        output_file.write("Num epochs: " + str(epochs) + "\n")
        results_file.write(str(epochs) + "\t")
        output_file.write("Layers size: " + str(layers_size) + "\n\n")
        results_file.write(str(layers_size) + "\t")
        output_file.write("Activation func: " + ("Rectify" if activation is None else str(activation)) + "\n")
        results_file.write(("Rectify" if activation is None else str(activation)) + "\t")
        output_file.write(
            "Last layer activation func: " + ("Rectify" if last_layer_activation is None else str(last_layer_activation)) + "\n")
        results_file.write(("Rectify" if activation is None else str(last_layer_activation)) + "\t")
        #         output_file.write("Multiple Positives by: " + str(multiple_positives) + "\n")
        output_file.write("Number of images: " + str(end_index) + "\n")
        results_file.write(str(end_index) + "\t")
        output_file.write("Dropout noise precent: " + str(dropout_percent * 100) + "%\n")
        results_file.write(str(dropout_percent * 100) + "%\t")
        output_file.write("Train/validation split: " + str(train_valid_split) + "\n")
        results_file.write(str(train_valid_split) + "\t")
        output_file.write("shuffle_input: " + str(shuffle_input) + "\n")
        results_file.write(str(shuffle_input) + "\t")
        output_file.write("zero_meaning: " + str(zero_meaning) + "\n\n")
        results_file.write(str(zero_meaning) + "\t")

        output_file.write("history: " + str(train_history) + "\n\n")
        results_file.write(str(train_history) + "\t")
        output_file.write("layer_info:\n" + str(layer_info) + "\n")
        results_file.write("[" + str(layer_info).replace("\n", ",") + "]\t")
        output_file.write("filters_info:\n" + str(filter_1) + "\n")
        output_file.write(str(filter_2) + "\n")
        output_file.write(str(filter_3) + "\n")
        output_file.write(str(filter_4) + "\n")
        output_file.write(str(filter_5) + "\n")
        output_file.write(str(filter_6) + "\n\n")
        results_file.write("{" + str((filter_1, filter_2, filter_3, filter_4, filter_5, filter_6)) + "]\t")
        output_file.write("Run time[minutes] is: " + str(run_time) + "\n")

        output_file.flush()
        results_file.write(str(time.ctime()) + "\t")
        results_file.write(folder_name + "\n")
        results_file.flush()

    def outputLastLayer_CNN(cnn, X, y, test_x, test_y):
        print "outputing last hidden layer" #     train_last_hiddenLayer = cnn.output_hiddenLayer(train_x)
        quarter_x = np.floor(X.shape[0] / 4)
        train_last_hiddenLayer1 = cnn.output_hiddenLayer(X[:quarter_x])
        print "after first quarter train output"
        train_last_hiddenLayer2 = cnn.output_hiddenLayer(X[quarter_x:2 * quarter_x])
        print "after seconed quarter train output"
        train_last_hiddenLayer3 = cnn.output_hiddenLayer(X[2 * quarter_x:3 * quarter_x])
        print "after third quarter train output"
        train_last_hiddenLayer4 = cnn.output_hiddenLayer(X[3 * quarter_x:])
        print "after all train output"
        test_last_hiddenLayer = cnn.output_hiddenLayer(test_x)
        print "after test output" #     lastLayerOutputs = (train_last_hiddenLayer,train_y,test_last_hiddenLayer,test_y)
        lastLayerOutputs = np.concatenate((train_last_hiddenLayer1, train_last_hiddenLayer2, train_last_hiddenLayer3, train_last_hiddenLayer4), axis=0), y, test_last_hiddenLayer, test_y
        return lastLayerOutputs

    def outputLastLayer_DAE(train_x, train_y, test_x, test_y):

        # building the SDA
        sDA = StackedDA(layers_size)

        # pre-trainning the SDA
        sDA.pre_train(train_x, noise_rate=input_noise_rate, epochs=pre_train_epochs,LOG=log_file)

        # saving a PNG representation of the first layer
        W = sDA.Layers[0].W.T[:, 1:]
        #         import rl_dae.utils
        #         utils.saveTiles(W, img_shape= (28,28), tile_shape=(10,10), filename="results/res_dA.png")

        # adding the final layer
        #         sDA.finalLayer(train_x, train_y, epochs=softmax_train_epochs)

        # trainning the whole network
        #         sDA.fine_tune(train_x, train_x, epochs=fine_tune_epochs)

        # predicting using the SDA
        testRepresentation = sDA.predict(test_x)
        pred = testRepresentation.argmax(1)

        # let's see how the network did
        #         test_category = test_y.argmax(1)
        e = 0.0
        t = 0.0
        for i in range(test_y.shape[0]):
            if any(test_y[i]):
                e += (test_y[i,pred[i]]==1)
                t += 1

        # printing the result, this structure should result in 80% accuracy
        print "DAE accuracy: %2.2f%%"%(100*e/t)
        output_file.write("DAE predict rate:  "+str(100*e/t) + "%\n")

        lastLayerOutputs = (sDA.predict(train_x), train_y, testRepresentation, test_y)
        return lastLayerOutputs #sDA

    start_time = time.clock()
    print ("Start time: ", time.ctime())

    if loadedData is None:
        train_x, train_y, test_x, test_y = load2d(categories, output_file, input_width, input_height, end_index, multiple_positives, dropout_percent)  # load 2-d data
    else:
        train_x, train_y, test_x, test_y = loadedData

    if zero_meaning:
        train_x = train_x.astype(np.float64)
        mu, sigma = np.mean(train_x.flatten()), np.std(train_x.flatten())
        print("Mean- ", mu)
        print("Std- ", sigma)
        train_x = (train_x - mu) / sigma

    x_train = train_x[:end_index].astype(np.float32).reshape((-1, 1, input_width, input_height))
    x_out = x_train.reshape((x_train.shape[0], -1))
    # test_x = test_x.astype(np.float32).reshape((-1, 1, input_width, input_height))

    cnn = createCSAE(input_height, input_width, x_train, x_out)


    ''' Denoising Autoencoder
    dae = DenoisingAutoencoder(n_hidden=10)
    dae.fit(train_x)
    new_X = dae.transform(train_x)
    print new_X
    '''

    '''Conv Stacked AE
    train_x = np.rint(train_x * 256).astype(np.int).reshape((-1, 1, input_width, input_height ))  # convert to (0,255) int range (we'll do our own scaling)
    mu, sigma = np.mean(train_x.flatten()), np.std(train_x.flatten())

    x_train = train_x.astype(np.float64)
    x_train = (x_train - mu) / sigma
    x_train = x_train.astype(np.float32)

    # we need our target to be 1 dimensional
    x_out = x_train.reshape((x_train.shape[0], -1))

    test_x = np.rint(test_x * 256).astype(np.int).reshape((-1, 1, input_width, input_height ))  # convert to (0,255) int range (we'll do our own scaling)
    # mu, sigma = np.mean(test_x.flatten()), np.std(test_x.flatten())
    test_x = train_x.astype(np.float64)
    test_x = (x_train - mu) / sigma
    test_x = x_train.astype(np.float32)
    '''

    ''' CNN with lasagne
    cnn = createNNwithMomentom(input_height, input_width) if update_rho == None else createNNwithDecay(input_height, input_width)
    cnn.fit(train_x, train_y)
    lastLayerOutputs = outputLastLayer_CNN(cnn, train_x, train_y, test_x, test_y)
    '''

    '''  AE (not Stacked) with Convolutional layers
    cnn = createCnn_AE(input_height, input_width)
    cnn.fit(x_train, x_out)
    '''

    ''' Stacaked AE with lasagne
    cnn = createSAE(input_height, input_width, x_train, x_out)
    '''

    run_time = (time.clock() - start_time) / 60.

    writeOutputFile(output_file, cnn.train_history_, PrintLayerInfo._get_layer_info_plain(cnn))

    print ("Learning took (min)- ", run_time)
    try:
        train_x = np.random.binomial(1, 1 - dropout_percent, size=train_x.shape) * train_x
        trian_last_hiddenLayer = cnn.output_hiddenLayer(train_x)
        print ("Pickling all encoded images:")
        pickle.dump(trian_last_hiddenLayer, open(folder_path + 'encode.pkl', 'w'))
    except:
        print ("Could not save encoded images")

    print ("Runing SVM:")
    run_svm(trian_last_hiddenLayer)

    sys.setrecursionlimit(10000)
    # pickle.dump(cnn, open(folder_path+'conv_ae.pkl', 'w'))
    # ae = pickle.load(open('mnist/conv_ae.pkl','r'))
    # cnn.save_weights_to(folder_path+'conv_ae.np')

    # run_svm(cnn)

    return cnn.train_history_[-1]['valid_accuracy']