как определить форму тензора при использовании batch_size в керасе (initial_value должен иметь указанную форму) - PullRequest
0 голосов
/ 05 июля 2019

У меня есть custom layer, в одной строке этого обычного слоя я делаю так:

out = tf.Variable(tf.zeros(shape=tf.shape(tf_a1), dtype=tf.float32))

Когда я запускаю код, я получаю эту ошибку:

ValueError: initial_value должен иметь указанную форму: Tensor ("lambda_1 / zeros_2: 0", shape = (?, 20), dtype = float32)

Я искал и обнаружил, что могу использовать validate_shape=False

Поэтому я изменяю код на:

out = tf.Variable(tf.zeros(shape=tf.shape(tf_a1), dtype=tf.float32), validate_shape=False)

Затем возникает эта ошибка:

ValueError: вход 0 несовместим с повторителем слоя: ожидаетсяndim = 2, найдено ndim = нет

Update1

, когда я пытаюсь это сделать:

out = tf.Variable(tf.zeros_like(tf_a1, dtype=tf.float32))

Это снова вызывает ошибку:

initial_value должно иметь указанную форму: Tensor ("lambda_1 / zeros_like: 0", shape = (?, 20), dtype = float32)

Также,когда я даю это явно так:

out = tf.Variable(tf.zeros(shape=(BATCH_SIZE, LATENT_SIZE), dtype=tf.float32))

Возникает эта ошибка:

ValueError: Операция имеет None для градиента.Пожалуйста, убедитесь, что все ваши операции имеют определенный градиент (то есть являются дифференцируемыми).Обычные операции без градиента: K.argmax, K.round, K.eval.

На всякий случай модель может помочь выяснить, откуда возникает эта ошибка:

этолямбда-слой, в котором просто немного изменить матрицу:

def score_cooccurance(tf_a1):
    N = tf.shape(tf_a1)[0]
    n = 2
    input_tf = tf.concat([tf_a1, tf.zeros((1, tf_a1.shape[1]), tf_a1.dtype)], axis=0)
    tf_a2 = tf.sort(sent_wids, axis=1)
    first_col_change = tf.zeros([tf_a2.shape[0], 1], dtype=tf.int32)
    last_cols_change = tf.cast(tf.equal(tf_a2[:, 1:], tf_a2[:, :-1]), tf.int32)
    change_bool = tf.concat([first_col_change, last_cols_change], axis=-1)
    not_change_bool = 1 - change_bool
    tf_a2_changed = tf_a2 * not_change_bool + change_bool * N #here

    idx = tf.where(tf.count_nonzero(tf.gather(input_tf, tf_a2_changed, axis=0), axis=1) >= n)
    y, x = idx[:, 0], idx[:, 1]
    rows_tf = tf.gather(tf_a2, y, axis=0)

    columns_tf = tf.cast(x[:, None], tf.int32)

    out = tf.Variable(tf.zeros(shape=(BATCH_SIZE, LATENT_SIZE), dtype=tf.float32))

    rows_tf = tf.reshape(rows_tf, shape=[-1, 1])

    columns_tf = tf.reshape(
        tf.tile(columns_tf, multiples=[1, tf.shape(tf_a2)[1]]),
        shape=[-1, 1])

    sparse_indices = tf.reshape(
        tf.concat([rows_tf, columns_tf], axis=-1),
        shape=[-1, 2])
    v = tf.gather_nd(input_tf, sparse_indices)
    v = tf.reshape(v, [-1, tf.shape(tf_a2)[1]])

    scatter = tf.scatter_nd_update(out, tf.cast(sparse_indices, tf.int32), tf.reshape(v, shape=[-1]))
    return scatter

На самом деле, когда я распечатываю форму out, она распечатывает <unknown>.

Любая идея илиТрюки, как я могу это исправить?

Я использую tensorflow 1.13.

Спасибо за вашу помощь:)

1 Ответ

0 голосов
/ 05 июля 2019

Таким образом, обходной путь в моем случае состоял в том, чтобы удалить tf.variable только иметь tf.zeros.в этом случае tf.scater_nd_update выдает ошибку, поскольку ее нельзя применить к tensors.

. Кажется, есть tensor_scatter_nd_update, о котором я раньше не знал.поэтому я также изменил эту строку, теперь код работает нормально, хотя я не получил основную причину ошибки.Я просто изменяю его таким образом, чтобы он успешно работал.

out = tf.zeros(shape=tf.shape(tf_a1), dtype=tf.float32)
scatter = tf.tensor_scatter_update(out, tf.cast(sparse_indices, tf.int32), tf.reshape(v, shape=[-1]))

Спасибо @Daniel Moller за указание концепции обучаемых переменных ...:)

...