tf.nn.static_rnn - вход должен быть последовательностью

Я смог использовать это, больше не используя параметр includeAll в файле db.changelog-master.yaml. Опция includeAll - это полезный способ быстро начать работу (и обработать все файлы в определенном каталоге), но, похоже, нецелесообразно для регулярного использования. Как упоминалось здесь .

Это то, что я ранее имел в db.changelog-master.yaml, не использую его таким образом.

databaseChangeLog:
    - includeAll:
        path: db/changelog/changes/

Это то, что Я обновил его до:

databaseChangeLog:
    - include:
        file: db/changelog/changes/v0001_users.sql
    - include:
        file: db/changelog/changes/v0002_accounts.sql

. Важно отметить, что я перечисляю каждый отдельный файл, который я хочу включить, в том порядке, в котором я хочу его запустить.

В исходной версии столбец databasechangelog.filename будет отличаться в зависимости от того, как было выполнено приложение:

  • db/changelog/changes/v0001_users.sql - как будет выглядеть столбец при запуске из IntelliJ
  • BOOT-INF/classes/db/changelog/changes/v0001_users.sql, как будет выглядеть столбец при запуске из исполняемого банку.

После внесения изменений оба варианта выше одинаковы и больше не включают BOOT-INF/classes/ в качестве префикса.

Благодаря другим ответам, которые помогли мне указать в правильном направлении!

2
задан msa 18 January 2019 в 19:39
поделиться

1 ответ

Если мы предположим, что вы используете tf.dynamic_rnn (для случая tf.static_rnn, первая проблема заключается в том, что вы не даете ввод в правильном формате, tf.static_rnn за исключением последовательности тензоров, такой как список тензоров). [batch_size x seq_len] и ни одного тензора с формой [batch_size x seq_len x dim], тогда как tf.dynamic_rnn имеет дело с такими тензорами в качестве входных данных)

Я предлагаю вам прочитать документацию tf.nn_dynamic_rnn , чтобы увидеть, что для вашей задачи классификации вы можете использовать не lstm_outputs, а state, которые в основном содержат последний выход вашего RNN, потому что lstm_output содержит все выходы, тогда как здесь вас интересует только last_output (кроме случаев, когда вы хотите сделайте что-то вроде внимания для классификации, здесь вам понадобятся все результаты).

Чтобы получить последний вывод, вам в основном нужно сделать это:

lstm_outputs, state = tf.nn.dynamic_rnn(cell=cell,inputs=embedded_chars, dtype=tf.float32)
last_output = state[-1].h

state[-1], чтобы получить состояние последней ячейки, затем h содержит последний вывод и передать last_output. ] к вашей сети прямой связи.

Полный код

(работает, но вычисляет неправильную точность, см. Комментарии)

n_classes = 6
n_steps = 27
num_hidden=128
dropout_keep_prob =0.5
vocab_size=10000
EMBEDDING_DIM=300
num_layers = 2

with tf.name_scope('Placeholders'):
    input_x = tf.placeholder(tf.int32, [None, n_steps], name='input_x')
    input_y = tf.placeholder(tf.float32, [None, n_classes], name='input_y')
    dropout_keep_prob = tf.placeholder(tf.float32, name='dropout_keep_prob')


with tf.name_scope('Embedding_layer'):
    embeddings_var = tf.Variable(tf.random_uniform([vocab_size, EMBEDDING_DIM], -1.0, 1.0), trainable=True)
    embedded_chars = tf.nn.embedding_lookup(embeddings_var, input_x)
    print(embedded_chars, 'embed')


def get_a_cell(lstm_size, keep_prob):
    lstm = tf.nn.rnn_cell.BasicLSTMCell(lstm_size)
    drop = tf.nn.rnn_cell.DropoutWrapper(lstm, output_keep_prob=dropout_keep_prob)
    return drop


with tf.name_scope('lstm'):
    cell = tf.nn.rnn_cell.MultiRNNCell(
        [get_a_cell(num_hidden, dropout_keep_prob) for _ in range(num_layers)]
    )

lstm_outputs, state = tf.nn.dynamic_rnn(cell=cell,inputs=embedded_chars, dtype=tf.float32)
last_output = state[-1].h
with tf.name_scope('Fully_connected'):
    W = tf.Variable(tf.truncated_normal([num_hidden, n_classes], stddev=0.1))
    b = tf.Variable(tf.constant(0.1, shape=[n_classes]))
    output = tf.nn.xw_plus_b(last_output,W,b)
    predictions = tf.argmax(output, 1, name='predictions')

with tf.name_scope('Loss'):
    # Cross-entropy loss and optimizer initialization
    loss1 = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=output, labels=input_y))
    global_step = tf.Variable(0, name="global_step", trainable=False)
    optimizer = tf.train.AdamOptimizer(learning_rate=1e-3).minimize(loss1, global_step=global_step)

with tf.name_scope('Accuracy'):
    # Accuracy metrics
    accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.round(tf.nn.softmax(output)), input_y), tf.float32))

with tf.name_scope('num_correct'):
    correct_predictions = tf.equal(predictions, tf.argmax(input_y, 1))
    num_correct = tf.reduce_sum(tf.cast(correct_predictions, 'float'), name='num_correct')
0
ответ дан abcdaire 18 January 2019 в 19:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: