예제 #1
0
def model_ae(X1,
             X2,
             gt,
             para_lambda,
             dims,
             act,
             lr,
             epochs,
             batch_size,
             Print=False):
    """
    Building model
    :rtype: object
    :param X1: data of view1
    :param X2: data of view2
    :param gt: ground truth
    :param para_lambda: trade-off factor in objective
    :param dims: dimensionality of each layer
    :param act: activation function of each net
    :param lr: learning rate
    :param epochs: learning epoch
    :param batch_size: batch size
    """
    start = timeit.default_timer()
    err_pre = list()

    # define each net architecture and variable(refer to framework-simplified)
    net_ae1 = Net_ae(1, dims[0], para_lambda, act[0])
    net_ae2 = Net_ae(2, dims[1], para_lambda, act[1])
    net_dg1 = Net_dg(1, dims[2], act[2])
    net_dg2 = Net_dg(2, dims[3], act[3])

    x1_input = tf.placeholder(np.float32, [None, dims[0][0]])
    x2_input = tf.placeholder(np.float32, [None, dims[1][0]])

    z_half1 = net_ae1.get_z_half(x1_input)
    z_half2 = net_ae2.get_z_half(x2_input)

    loss_pre = net_ae1.loss_reconstruct(x1_input) + net_ae2.loss_reconstruct(
        x2_input)
    pre_train = tf.train.AdamOptimizer(lr[0]).minimize(loss_pre)

    gpu_options = tf.GPUOptions(allow_growth=True)
    sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
    sess.run(tf.global_variables_initializer())

    # init inner AEs
    for k in range(epochs[0]):
        X1, X2, gt = shuffle(X1, X2, gt)
        for batch_x1, batch_x2, batch_No in next_batch(X1, X2, batch_size):
            _, val_pre = sess.run([pre_train, loss_pre],
                                  feed_dict={
                                      x1_input: batch_x1,
                                      x2_input: batch_x2
                                  })
            err_pre.append(val_pre)
            output = "Pre_epoch : {:.0f}, Batch : {:.0f}  ===> Reconstruction loss = {:.4f} ".format(
                (k + 1), batch_No, val_pre)
            if Print:
                print(output)
    fea_z_half1 = sess.run(z_half1, feed_dict={x1_input: X1})
    fea_z_half2 = sess.run(z_half2, feed_dict={x2_input: X2})
    elapsed = (timeit.default_timer() - start)
    print("Time used: ", elapsed)

    sess.close()
    tf.reset_default_graph()
    del net_ae1, net_ae2, net_dg1, net_dg2
    z = np.concatenate((fea_z_half1, fea_z_half2), axis=1)
    return z, gt
예제 #2
0
def model(X1, X2, gt, para_lambda, dims, act, lr, epochs, batch_size):
    """
    Building model
    :rtype: object
    :param X1: data of view1
    :param X2: data of view2
    :param gt: ground truth
    :param para_lambda: trade-off factor in objective
    :param dims: dimensionality of each layer
    :param act: activation function of each net
    :param lr: learning rate
    :param epochs: learning epoch
    :param batch_size: batch size
    """
    start = timeit.default_timer()
    err_pre = list()
    err_total = list()

    # define each net architecture and variable(refer to framework-simplified)
    net_ae1 = Net_ae(1, dims[0], para_lambda, act[0])
    net_ae2 = Net_ae(2, dims[1], para_lambda, act[1])
    net_dg1 = Net_dg(1, dims[2], act[2])
    net_dg2 = Net_dg(2, dims[3], act[3])
    #z_mean=Dense(latent_dim)(h)
    H = np.random.uniform(0, 1, [X1.shape[0], dims[2][0]])
    x1_input = tf.placeholder(np.float32, [None, dims[0][0]])
    x2_input = tf.placeholder(np.float32, [None, dims[1][0]])

    with tf.variable_scope("H"):
        h_input = tf.Variable(xavier_init(batch_size, dims[2][0]), name='LatentSpaceData')
        h_list = tf.trainable_variables()
    fea1_latent = tf.placeholder(np.float32, [None, dims[0][-1]])
    fea2_latent = tf.placeholder(np.float32, [None, dims[1][-1]])

    loss_pre = net_ae1.loss_reconstruct(x1_input) + net_ae2.loss_reconstruct(x2_input)
    pre_train = tf.train.AdamOptimizer(lr[0]).minimize(loss_pre)

    loss_ae = net_ae1.loss_total(x1_input, fea1_latent) + net_ae2.loss_total(x2_input, fea2_latent)
    update_ae = tf.train.AdamOptimizer(lr[1]).minimize(loss_ae, var_list=net_ae1.netpara.extend(net_ae2.netpara))
    z_half1 = net_ae1.get_z_half(x1_input)
    z_half2 = net_ae2.get_z_half(x2_input)

    loss_dg = para_lambda * (
                net_dg1.loss_degradation(h_input, fea1_latent) 
                + net_dg2.loss_degradation(h_input, fea2_latent))
    update_dg = tf.train.AdamOptimizer(lr[2]).minimize(loss_dg, var_list=net_dg1.netpara.extend(net_dg2.netpara))

    update_h = tf.train.AdamOptimizer(lr[3]).minimize(loss_dg, var_list=h_list)
    g1 = net_dg1.get_g(h_input)
    g2 = net_dg2.get_g(h_input)
    
    gpu_options = tf.GPUOptions(allow_growth=True)
    sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
    sess.run(tf.global_variables_initializer())
    
    #writer = tf.summary.FileWriter("./mnist_nn_log",sess.graph)
    #writer.close()
    # init inner AEs
    
    for k in range(epochs[0]):
        X1, X2, gt = shuffle(X1, X2, gt)
        for batch_x1, batch_x2, batch_No in next_batch(X1, X2, batch_size):
            _, val_pre = sess.run([pre_train, loss_pre], feed_dict={x1_input: batch_x1, x2_input: batch_x2})
            err_pre.append(val_pre)

            output = "Pre_epoch : {:.0f}, Batch : {:.0f}  ===> Reconstruction loss = {:.4f} ".format((k + 1), batch_No,
                                                                                                    val_pre)
            print(output)

    # the whole training process(ADM)
    num_samples = X1.shape[0]
    num_batchs = math.ceil(num_samples / batch_size)  # fix the last batch
    for j in range(epochs[1]):
        X1, X2, H, gt = shuffle(X1, X2, H, gt)
        for num_batch_i in range(int(num_batchs) - 1):
            start_idx, end_idx = num_batch_i * batch_size, (num_batch_i + 1) * batch_size
            end_idx = min(num_samples, end_idx)
            batch_x1 = X1[start_idx: end_idx, ...]
            batch_x2 = X2[start_idx: end_idx, ...]
            batch_h = H[start_idx: end_idx, ...]

            batch_g1 = sess.run(g1, feed_dict={h_input: batch_h})
            batch_g2 = sess.run(g2, feed_dict={h_input: batch_h})

            # ADM-step1: optimize inner AEs and
            _, val_ae = sess.run([update_ae, loss_ae], feed_dict={x1_input: batch_x1, x2_input: batch_x2,
                                                                fea1_latent: batch_g1, fea2_latent: batch_g2})
            
            # get inter - layer features(i.e., z_half)
            batch_z_half1 = sess.run(z_half1, feed_dict={x1_input: batch_x1})
            batch_z_half2 = sess.run(z_half2, feed_dict={x2_input: batch_x2})

            sess.run(tf.assign(h_input, batch_h))
            # ADM-step2: optimize dg nets
            
            _, val_dg = sess.run([update_dg, loss_dg], feed_dict={fea1_latent: batch_z_half1,
                                                                fea2_latent: batch_z_half2})

            # ADM-step3: update H
            for k in range(epochs[2]):
                sess.run(update_h, feed_dict={fea1_latent: batch_z_half1, fea2_latent: batch_z_half2})

            batch_h_new = sess.run(h_input)
            
            H[start_idx: end_idx, ...] = batch_h_new

            # get latest feature_g for next iteration
            sess.run(tf.assign(h_input, batch_h_new))
            batch_g1_new = sess.run(g1, feed_dict={h_input: batch_h})
            batch_g2_new = sess.run(g2, feed_dict={h_input: batch_h})

            val_total = sess.run(loss_ae, feed_dict={x1_input: batch_x1, x2_input: batch_x2,
                                                    fea1_latent: batch_g1_new, fea2_latent: batch_g2_new})
                                                    
            err_total.append(val_total)
            
            output = "Epoch : {:.0f} -- Batch : {:.0f} ===> Total training loss = {:.4f} ".format((j + 1),
                                                                                                (num_batch_i + 1),
                                                                                                val_total)
            print(output)

    elapsed = (timeit.default_timer() - start)
    print("Time used: ", elapsed)
    '''
    #?使用RBM  64->64
    rbm=RBM_t1(64,64)
    
    H=tf.cast(H,tf.float32)
    with tf.Session() as se:
        H=H.eval()
        H=H.tolist()
    rbm.train(H)
    H=rbm.rbm_outpt(H)
    '''
    scio.savemat('H.mat', mdict={'H': H, 'gt': gt, 'loss_total': err_total, 'time': elapsed,
                                    'x1': X1, 'x2': X2})
    return H, gt
예제 #3
0
def model_multi_view(X,
                     gt,
                     para_lambda,
                     dims_ae,
                     dims_dg,
                     act,
                     lr,
                     epochs,
                     batch_size,
                     Print=False):
    """
    Building model
    :rtype: object
    :param X: data of multiple view
    :param gt: ground truth
    :param para_lambda: trade-off factor in objective
    :param dims: dimensionality of each layer
    :param act: activation function of each net
    :param lr: learning rate
    :param epochs: learning epoch
    :param batch_size: batch size
    """
    start = timeit.default_timer()
    err_pre = list()
    err_total = list()

    # define each net architecture and variable(refer to framework-simplified)
    net_ae = dict()
    net_dg = dict()
    x_input = dict()
    fea_latent = dict()
    for v_num in range(len(X)):
        net_ae[str(v_num)] = Net_ae(v_num, dims_ae[v_num], para_lambda, act)
        net_dg[str(v_num)] = Net_dg(v_num, dims_dg[v_num], act)
        x_input[str(v_num)] = tf.placeholder(np.float32,
                                             [None, dims_ae[v_num][0]])
        fea_latent[str(v_num)] = tf.placeholder(np.float32,
                                                [None, dims_ae[v_num][-1]])
    H = np.random.uniform(0, 1, [X[str(0)].shape[0], dims_dg[0][0]])

    with tf.variable_scope("H"):
        h_input = tf.Variable(xavier_init(batch_size, dims_dg[0][0]),
                              name='LatentSpaceData')
        h_list = tf.trainable_variables()

    loss_pre = 0
    loss_ae = 0
    for v_num in range(len(X)):
        loss_pre = loss_pre + net_ae[str(v_num)].loss_reconstruct(
            x_input[str(v_num)])
        loss_ae = loss_ae + net_ae[str(v_num)].loss_total(
            x_input[str(v_num)], fea_latent[str(v_num)])

    pre_train = tf.train.AdamOptimizer(lr[0]).minimize(loss_pre)

    ae_varlist = tf.trainable_variables(scope='aenet')

    update_ae = tf.train.AdamOptimizer(lr[1]).minimize(loss_ae,
                                                       var_list=ae_varlist)
    z_half = dict()
    for v_num in range(len(X)):
        z_half[str(v_num)] = net_ae[str(v_num)].get_z_half(x_input[str(v_num)])

    loss_dg = 0
    for v_num in range(len(X)):
        loss_dg = loss_dg + para_lambda * (net_dg[str(v_num)].loss_degradation(
            h_input, fea_latent[str(v_num)]))

    dg_varlist = tf.trainable_variables(scope='dgnet')
    update_dg = tf.train.AdamOptimizer(lr[2]).minimize(loss_dg,
                                                       var_list=dg_varlist)

    update_h = tf.train.AdamOptimizer(lr[3]).minimize(loss_dg, var_list=h_list)

    g = dict()
    for v_num in range(len(X)):
        g[str(v_num)] = net_dg[str(v_num)].get_g(h_input)

    gpu_options = tf.GPUOptions(allow_growth=True)
    sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
    sess.run(tf.global_variables_initializer())

    # init inner AEs
    for k in range(epochs[0]):
        index = shuffle(np.arange(len(gt)))
        for v_num in range(len(X)):
            X[str(v_num)] = X[str(v_num)][index]
        gt = gt[index]
        pre_feed_dict = {
            x_input[str(v_num)]: X[str(v_num)]
            for v_num in range(len(X))
        }
        _, val_pre = sess.run([pre_train, loss_pre], feed_dict=pre_feed_dict)
        err_pre.append(val_pre)
        output = "Pre_epoch : {:.0f} ===> Reconstruction loss = {:.4f} ".format(
            (k + 1), val_pre)
        if Print:
            print(output)

    # the whole training process(ADM)
    for j in range(epochs[1]):
        index = shuffle(np.arange(len(gt)))
        for v_num in range(len(X)):
            X[str(v_num)] = X[str(v_num)][index]
        gt = gt[index]
        H = H[index]

        g_input = dict()
        for v_num in range(len(X)):
            g_input[str(v_num)] = sess.run(g[str(v_num)],
                                           feed_dict={h_input: H})

        # ADM-step1: optimize inner AEs and
        stp1_feed_dict = {
            x_input[str(v_num)]: X[str(v_num)]
            for v_num in range(len(X))
        }
        stp1_feed_dict.update({
            fea_latent[str(v_num)]: g_input[str(v_num)]
            for v_num in range(len(X))
        })

        _, val_ae = sess.run([update_ae, loss_ae], feed_dict=stp1_feed_dict)

        # get inter - layer features(i.e., z_half)
        z_half_input = dict()
        for v_num in range(len(X)):
            z_half_input[str(v_num)] = sess.run(
                z_half[str(v_num)],
                feed_dict={x_input[str(v_num)]: X[str(v_num)]})

        sess.run(tf.assign(h_input, H))
        # ADM-step2: optimize dg nets
        stp2_feed_dict = {
            fea_latent[str(v_num)]: z_half_input[str(v_num)]
            for v_num in range(len(X))
        }

        _, val_dg = sess.run([update_dg, loss_dg], feed_dict=stp2_feed_dict)

        # ADM-step3: update H
        stp3_feed_dict = {
            fea_latent[str(v_num)]: z_half_input[str(v_num)]
            for v_num in range(len(X))
        }
        for k in range(epochs[2]):
            sess.run(update_h, feed_dict=stp3_feed_dict)

        h_new = sess.run(h_input)
        H = h_new

        # get latest feature_g for next iteration
        sess.run(tf.assign(h_input, H))

        g_input_new = dict()
        for v_num in range(len(X)):
            g_input_new[str(v_num)] = sess.run(g[str(v_num)],
                                               feed_dict={h_input: H})

        val_feed_dict = {
            x_input[str(v_num)]: X[str(v_num)]
            for v_num in range(len(X))
        }
        val_feed_dict.update({
            fea_latent[str(v_num)]: g_input_new[str(v_num)]
            for v_num in range(len(X))
        })
        val_total = sess.run(loss_ae, feed_dict=val_feed_dict)

        err_total.append(val_total)
        output = "Epoch : {:.0f} ===> Total training loss = {:.4f} ".format(
            (j + 1), val_total)
        if Print:
            print(output)

    elapsed = (timeit.default_timer() - start)
    print("Time used: ", elapsed)
    # scio.savemat('H.mat', mdict={'H': H, 'gt': gt, 'loss_total': err_total, 'time': elapsed,
    #  'x1': X1, 'x2': X2})
    sess.close()
    tf.reset_default_graph()
    del net_ae, net_dg
    return H, gt