示例#1
0
def train(model, x, y, epochs, batch_size=1, validation_data=None):
    train_op = model.optimizer.minimize(model.loss)
    train_gen = BatchGenerator((x, y), batch_size=batch_size)

    steps_per_epoch = np.ceil(train_gen.data_length / batch_size).astype(
        np.int32)

    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())

        for epoch in range(1, epochs + 1):
            prog_bar = utils.Progbar(steps_per_epoch)
            print('Epoch {}/{}'.format(epoch, epochs))
            for step, (inputs, labels,
                       sequence_length) in enumerate(train_gen.next_batch(),
                                                     1):

                indices = np.array([labels.row, labels.col]).T
                values = np.array(labels.data)
                dense_shape = labels.shape

                _, loss = sess.run(
                    [train_op, model.loss],
                    feed_dict={
                        model.inputs:
                        inputs,
                        model.labels:
                        tf.SparseTensorValue(indices, values, dense_shape),
                        model.sequence_length:
                        sequence_length
                    })

                if steps_per_epoch == step:
                    update_values = [('loss', loss)]
                    if validation_data is not None:
                        val_ler, val_loss = eval(sess, model, *validation_data)
                        update_values += [('val_loss', val_loss),
                                          ('val_ler', val_ler)]

                    prog_bar.update(step, values=update_values, force=True)
                else:
                    prog_bar.update(step, values=[('loss', loss)])
示例#2
0
def eval(sess, model, x, y, batch_size=32):
    gen = BatchGenerator((x, y), batch_size=batch_size)
    ler, loss = 0, 0
    for inputs, labels, sequence_length in gen.next_batch():
        indices = np.array([labels.row, labels.col]).T
        values = np.array(labels.data)
        dense_shape = labels.shape
        _labels = tf.SparseTensorValue(indices, values, dense_shape)

        decoded, _loss = sess.run(
            [model.decoded, model.loss],
            feed_dict={
                model.inputs: inputs,
                model.labels: _labels,
                model.sequence_length: sequence_length
            })

        _ler = edit_distance(decoded[0], _labels)

        ler += _ler * len(inputs)
        loss += _loss * len(inputs)

    return ler / len(x), loss / len(x)