cnn2 = CNN(cnn1.output(), filter_shape, filter_shift_list[1], node_shape[1], node_shape[2], pre_train_lr, pre_train_epoch)
    output_list = cnn2.output()
    saveImage(output_list, node_shape[2], 'cnn2_before_train')

    cnn2.pre_train()
    output_list = cnn2.output()
    saveImage(output_list, node_shape[2], 'cnn2_after_train')

    rbm_size_list = (680, 340, 170, 85, 42, 21, 10, 3)

    # def __init__(self, W, input, data_size,input_size, output_size, isDropout):
    rbm1 = RBM(None, cnn2.output(), file_num, rbm_size_list[0], rbm_size_list[1], False)
    for i in xrange(pre_train_epoch):
        print 'rbm1 pre_train:' + str(i)
        rbm1.contrast_divergence()
    reinput = rbm1.reconstruct_from_input(rbm1.input)
    saveImage(reinput, node_shape[2], 'rbm1_after_train')
    saveW(rbm1.getW(), 'rbm1_after_train')

    rbm2 = RBM(None, rbm1.output(), file_num, rbm_size_list[1], rbm_size_list[2], False)
    for i in xrange(pre_train_epoch):
        print 'rbm2 pre_train:' + str(i)
        rbm2.contrast_divergence()
    reinput = rbm2.reconstruct_from_input(rbm2.input)
    reinput = rbm1.reconstruct_from_output(reinput)
    saveImage(reinput, node_shape[2], 'rbm2_after_train')
    saveW(rbm2.getW(), 'rbm2_after_train')

    rbm3 = RBM(None, rbm2.output(), file_num, rbm_size_list[2], rbm_size_list[3], False)
    for i in xrange(pre_train_epoch):
        print 'rbm3 pre_train:' + str(i)
            if not os.path.exists(dir_name):
                os.mkdir(dir_name)
            os.chdir(dir_name)

            # Feature
            output = rbm1.output_from_input(rbm1.input)
            output = rbm2.output_from_input(output)
            output = rbm3.output_from_input(output)
            output = rbm4.output_from_input(output)
            output = rbm5.output_from_input(output)
            output = rbm6.output_from_input(output)
            output = rbm7.output_from_input(output)
            saveFeatures(output)

            # RBM1 Save
            reinput = rbm1.reconstruct_from_input(rbm1.input)
            saveImage(reinput, node_shape[2], 'rbm1_after_train')
            saveW(rbm1.getW(), 'rbm1_after_train')

            # RBM2 Save
            output = rbm1.output_from_input(rbm1.input)
            output = rbm2.output_from_input(output)
            reinput = rbm2.reconstruct_from_output(output)
            reinput = rbm1.reconstruct_from_output(reinput)
            saveImage(reinput, node_shape[2], 'rbm2_after_train')
            saveW(rbm2.getW(), 'rbm2_after_train')

            # RBM3 Save
            output = rbm1.output_from_input(rbm1.input)
            output = rbm2.output_from_input(output)
            output = rbm3.output_from_input(output)