Esempio n. 1
0
    else:
        hidden_states, states = swapping_rnn(input_features,
                                             initial_state=initial_state,
                                             layers=args.layers,
                                             sequence_lengths=None,
                                             state_index=None)


    # evaluate on selected outputs from rnn
    eval_vecs = [tf.placeholder(tf.int32, [None], name='eval_%s' % i)
                 for i in range(args.num_steps - args.use_next_time_step)]
    hidden_states = [tf.nn.embedding_lookup(hidden_state, state_indices)
                     for hidden_state, state_indices in zip(hidden_states, eval_vecs)]
    hidden_matrix = tf.concat(hidden_states, 0)

    loss_spec = make_loss_spec(dataspecs, mvn)

    loss_matrix = multivariate_loss(hidden_matrix, loss_spec, ph_dict)
    loss_vector = tf.reduce_sum(loss_matrix, reduction_indices=1)  # is MB x 1
    loss = tf.reduce_mean(loss_vector)  # is scalar
    loss_names = get_multivariate_loss_names(loss_spec)
    eval_tensors = [loss, loss_vector, loss_matrix] + np.array(states).flatten().tolist()

    # Create an object to train on this graph
    initial_state = np.array(initial_state).flatten().tolist()
    ph_dict.update({'initial_state': initial_state,
                    'eval_indices': eval_vecs})

    trainer = ModelRunner(loss, ph_dict, args.learnrate, debug=args.debug)
    data = StateTrackingBatcher(args.datafile, dataspecs,
                                batchsize=args.mb,
Esempio n. 2
0
def run_dnn_test(args):
    data_file, data_spec_file, outdir = args
    """Run DNN model on data file given parameters."""
    nl = config.dnn.num_layers
    hs = config.dnn.hidden_size
    # io and state
    print('running DNN with nl={}, hs={}'.format(nl, hs))
    start = time.time()
    dataspecs = json.load(open(data_spec_file, 'r'))
    feature_spec = make_feature_spec(dataspecs)
    datastart_index = dataspecs['counts']['index'][0]
    normalizers = {'none': None, 'layer': layer_norm, 'batch': batch_normalize}
    tf.set_random_seed(config.state.random_seed)
    data = OnlineBatcher(data_file,
                         config.dnn.batch_size,
                         skipheader=True,
                         delimiter=' ')
    # activation
    if config.dnn.activation == 'tanh':
        activation = tf.tanh
    elif config.dnn.activation == 'relu':
        activation = tf.nn.relu
    else:
        raise ValueError('Activation must be "relu", or "tanh"')
    # mvn
    if config.dnn.dist == "ident":
        mvn = eyed_mvn_loss
    elif config.dnn.dist == "diag":
        mvn = diag_mvn_loss
    elif config.dnn.dist == "full":
        mvn = full_mvn_loss
        raise ValueError('dnn.dist must be "ident", "diag", or "full"')
    # setup tf model
    x, ph_dict = join_multivariate_inputs(feature_spec, dataspecs, 0.75, 1000,
                                          2)
    h = dnn(x,
            layers=[hs for i in range(nl)],
            act=activation,
            keep_prob=None,
            norm=normalizers[config.dnn.normalizer],
            scale_range=1.0)
    loss_spec = make_loss_spec(dataspecs, mvn)
    loss_matrix = multivariate_loss(h, loss_spec, ph_dict, variance_floor=0.01)
    loss_vector = tf.reduce_sum(loss_matrix, reduction_indices=1)  # is MB x 1
    loss = tf.reduce_mean(loss_vector)  # is scalar
    loss_names = get_multivariate_loss_names(loss_spec)
    eval_tensors = [loss, loss_vector, loss_matrix]
    model = ModelRunner(loss,
                        ph_dict,
                        learnrate=config.dnn.lr,
                        opt='adam',
                        debug=config.dnn.debug,
                        decay_rate=1.0,
                        decay_steps=20)
    raw_batch = data.next_batch()
    current_loss = sys.float_info.max
    not_early_stop = EarlyStop(20)
    loss_feats = [triple[0] for triple in loss_spec]
    # start training
    start_time = time.time()
    continue_training = not_early_stop(raw_batch, current_loss)
    # mat is not None and self.badcount < self.badlimit and loss != inf, nan:
    rst = []
    while continue_training:
        datadict = split_batch(raw_batch, dataspecs)
        targets = {'target_' + name: datadict[name] for name in loss_feats}
        datadict.update(targets)
        current_loss, pointloss, contrib = model.eval(datadict, eval_tensors)
        model.train_step(datadict)
        for user, day, score, red in zip(
                datadict['user'].flatten().tolist(),
                datadict['time'].flatten().tolist(),
                pointloss.flatten().tolist(),
                datadict['redteam'].flatten().tolist()):
            rst.append((user, int(day), score, red))
        if data.index % 10000 == 1:
            print('index: %s loss: %.4f' % (data.index, current_loss))
            sys.stdout.flush()
        raw_batch = data.next_batch()
        continue_training = not_early_stop(raw_batch, current_loss)
        if continue_training < 0:
            break
    # save the (user, day, score, red).
    train_rst, test_rst = split_train_test(rst)
    outfile1, outfile2 = FileName.get_dnn_rst_name()
    save_rst(train_rst, outfile1)
    save_rst(test_rst, outfile2)
    print('')
    eval_cr(test_rst, 'dnn')
    dt = time.time() - start
    print("run_dnn_test Done. Elapsed time is %.2f seconds." % dt)