Tensorflow: ValueError: попытка повторного использования RNNCell с другой областью действия переменных, чем при первом использовании.

Созданный на 8 мар. 2017  ·  102Комментарии  ·  Источник: tensorflow/tensorflow

Я не уверен, что я первый, кто столкнулся со следующей ошибкой:

ValueError: попытка повторного использования RNNCellс другой областью действия переменных, чем его первое использование. Первое использование ячейки было с областью действия «rnn/multi_rnn_cell/cell_0/basic_lstm_cell», эта попытка — с областью действия «rnn/multi_rnn_cell/cell_1/basic_lstm_cell». Пожалуйста, создайте новый экземпляр ячейки, если вы хотите использовать другой набор весов. Если раньше вы использовали: MultiRNNCell([BasicLSTMCell(...)] * num_layers), измените на: MultiRNNCell([BasicLSTMCell(...) for _ in range(num_layers)]). Если раньше вы использовали один и тот же экземпляр ячейки в качестве прямой и обратной ячейки двунаправленной RNN, просто создайте два экземпляра (один для прямого, один для обратного). В мае 2017 года мы начнем изменять поведение этой ячейки для использования существующих сохраненных весов, если таковые имеются, когда она вызывается с параметром scope=None (что может привести к скрытой деградации модели, поэтому эта ошибка останется до тех пор).

с фрагментом кода:

  import tensorflow as tf
  from tensorflow.contrib import rnn

  hidden_size = 100
  batch_size  = 100
  num_steps   = 100
  num_layers  = 100
  is_training = True
  keep_prob   = 0.4

  input_data = tf.placeholder(tf.float32, [batch_size, num_steps])
  lstm_cell = rnn.BasicLSTMCell(hidden_size, forget_bias=0.0, state_is_tuple=True)

  if is_training and keep_prob < 1:
      lstm_cell = rnn.DropoutWrapper(lstm_cell)
  cell = rnn.MultiRNNCell([lstm_cell for _ in range(num_layers)], state_is_tuple=True)

  _initial_state = cell.zero_state(batch_size, tf.float32)

  iw = tf.get_variable("input_w", [1, hidden_size])
  ib = tf.get_variable("input_b", [hidden_size])
  inputs = [tf.nn.xw_plus_b(i_, iw, ib) for i_ in tf.split(input_data, num_steps, 1)]

  if is_training and keep_prob < 1:
      inputs = [tf.nn.dropout(input_, keep_prob) for input_ in inputs]

  outputs, states = rnn.static_rnn(cell, inputs, initial_state=_initial_state)

Я безуспешно гуглил, может ли кто-нибудь показать мне выход?

awaiting tensorflower

Самый полезный комментарий

Я встретил ту же проблему. Если вы все используете скомпилированную версию в основной ветке, я считаю, что у нас та же проблема, вызванная недавним коммитом . Как говорится в сообщении коммита:

Сделайте так, чтобы все RNNCells в tf.contrib.rnn действовали как слои tf.layers, но с более строгой семантикой для
ж:

  1. При первом использовании __call__ используемая область сохраняется в ячейке. RNNCell пытается создать веса в этой области, но если некоторые из них уже установлены, возникает ошибка, если только RNNCell не была создана с аргументом reuse=True.

  2. Последующее использование __call__ того же экземпляра ячейки должно быть в той же области.
    Если это не так, возникает ошибка.

В моем случае, когда выполняется учебник ptb , решение состоит в том, чтобы просто добавить параметр с именем reuse , например, в строке 112:

def lstm_cell():
  return tf.contrib.rnn.BasicLSTMCell(
      size, forget_bias=0.0, state_is_tuple=True, reuse=tf.get_variable_scope().reuse)

Тогда это работает.

Все 102 Комментарий

Я получаю ту же ошибку при попытке запустить пример перевода (даже при выполнении небольшого самотестирования), который можно найти здесь: https://github.com/tensorflow/models/tree/master/tutorials/rnn/translate .

Я встретил ту же проблему. Если вы все используете скомпилированную версию в основной ветке, я считаю, что у нас та же проблема, вызванная недавним коммитом . Как говорится в сообщении коммита:

Сделайте так, чтобы все RNNCells в tf.contrib.rnn действовали как слои tf.layers, но с более строгой семантикой для
ж:

  1. При первом использовании __call__ используемая область сохраняется в ячейке. RNNCell пытается создать веса в этой области, но если некоторые из них уже установлены, возникает ошибка, если только RNNCell не была создана с аргументом reuse=True.

  2. Последующее использование __call__ того же экземпляра ячейки должно быть в той же области.
    Если это не так, возникает ошибка.

В моем случае, когда выполняется учебник ptb , решение состоит в том, чтобы просто добавить параметр с именем reuse , например, в строке 112:

def lstm_cell():
  return tf.contrib.rnn.BasicLSTMCell(
      size, forget_bias=0.0, state_is_tuple=True, reuse=tf.get_variable_scope().reuse)

Тогда это работает.

@ebrevdo Не могли бы вы взглянуть на это?

У меня проблема повторяется при использовании сборки Windows/GPU 105 в Shakespeare RNN Repo .

При запуске кода с выпуском Win 1.0.0/GPU проблем нет.

Это репо похоже, что оно предназначено для tf 1.0, а не для промежуточных выпусков.

8 марта 2017 г., 15:56, «Том Ванзек» [email protected] написал:

Проблема повторяется для меня при использовании сборки Windows/GPU 105 на Shakespeare.
Репозиторий RNN https://github.com/martin-gorner/tensorflow-rnn-shakespeare .

При запуске кода с выпуском Win 1.0.0/GPU проблем нет.


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/tensorflow/tensorflow/issues/8191#issuecomment-285209555 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/ABtim5ansaL1KN51T4nCaqLnqw2QHN4Wks5rj0BBgaJpZM4MWl4f
.

@tongda , я использую выпускную версию Tensorflow 1.0, работающую на MacOS в режиме процессора. Я переключусь на основную ветку, чтобы посмотреть, работает ли она, добавив параметр «повторное использование», спасибо.

doncat99: если вы это сделаете, убедитесь, что ваш код запрашивает версию tensorflow
и поднимает флаг, если версия ниже, чем версия основной ветки.
вам может потребоваться проверить:

из версий импорта tensorflow.core
версии.GIT_VERSION

В среду, 8 марта 2017 г., в 18:58, [email protected] написал:

@tongda https://github.com/tongda , я использую выпускную версию
Tensorflow 1.0, работающий на MacOS в режиме процессора. Я перейду к мастеру
ветке, чтобы увидеть, работает ли она, добавив параметр «повторное использование», спасибо.


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/tensorflow/tensorflow/issues/8191#issuecomment-285240438 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/ABtim66cU9e16lgD-2D0QLGcQCiHbV0zks5rj2rbgaJpZM4MWl4f
.

@ebrevdo Итак, каковы будут предложенные изменения в Shakepeare RNN, чтобы он мог работать с промежуточным стабильным выпуском?

Вот ключевой архитектурный раздел кода, который теперь не работает со сборкой № 105:

#
# the model (see FAQ in README.md)
#
lr = tf.placeholder(tf.float32, name='lr')  # learning rate
pkeep = tf.placeholder(tf.float32, name='pkeep')  # dropout parameter
batchsize = tf.placeholder(tf.int32, name='batchsize')

# inputs
X = tf.placeholder(tf.uint8, [None, None], name='X')    # [ BATCHSIZE, SEQLEN ]
Xo = tf.one_hot(X, ALPHASIZE, 1.0, 0.0)                 # [ BATCHSIZE, SEQLEN, ALPHASIZE ]
# expected outputs = same sequence shifted by 1 since we are trying to predict the next character
Y_ = tf.placeholder(tf.uint8, [None, None], name='Y_')  # [ BATCHSIZE, SEQLEN ]
Yo_ = tf.one_hot(Y_, ALPHASIZE, 1.0, 0.0)               # [ BATCHSIZE, SEQLEN, ALPHASIZE ]
# input state
Hin = tf.placeholder(tf.float32, [None, INTERNALSIZE*NLAYERS], name='Hin')  # [ BATCHSIZE, INTERNALSIZE * NLAYERS]

# using a NLAYERS=3 layers of GRU cells, unrolled SEQLEN=30 times
# dynamic_rnn infers SEQLEN from the size of the inputs Xo

onecell = rnn.GRUCell(INTERNALSIZE)
dropcell = rnn.DropoutWrapper(onecell, input_keep_prob=pkeep)
multicell = rnn.MultiRNNCell([dropcell for _ in range(NLAYERS)], state_is_tuple=False)
multicell = rnn.DropoutWrapper(multicell, output_keep_prob=pkeep)
Yr, H = tf.nn.dynamic_rnn(multicell, Xo, dtype=tf.float32, initial_state=Hin)
# Yr: [ BATCHSIZE, SEQLEN, INTERNALSIZE ]
# H:  [ BATCHSIZE, INTERNALSIZE*NLAYERS ] # this is the last state in the sequence

Кажется, я не нашел никакой документации, касающейся флага reuse ?

Заранее спасибо.

Использовать:

multicell = rnn.MultiRNNCell([rnn.DropoutWrapper(rnn.GRUCell(INTERNALSIZE),
input_keep_prob=pkeep) для _ в диапазоне(NLAYERS)], state_is_tuple=False)

Что создает отдельный объект grucell для каждого слоя.

10 марта 2017 г., 7:44, «Том Ванзек» [email protected] написал:

@ebrevdo https://github.com/ebrevdo Итак, что можно предложить
изменения в Shakepeare RNN, чтобы позволить ему работать с промежуточным
стабильный релиз?

Вот ключевой архитектурный раздел кода, который теперь терпит неудачу с
сборка №105:

модель (см. FAQ в README.md)

lr = tf.placeholder(tf.float32, name='lr') # скорость обучения
pkeep = tf.placeholder(tf.float32, name='pkeep') # параметр исключения
размер партии = tf.placeholder (tf.int32, имя = 'размер партии')

входы

X = tf.placeholder(tf.uint8, [None, None], name='X') # [ BATCHSIZE, SEQLEN ]
Xo = tf.one_hot(X, ALPHASIZE, 1.0, 0.0) # [ BATCHSIZE, SEQLEN, ALPHASIZE ]# ожидаемые результаты = та же самая последовательность, сдвинутая на 1, так как мы пытаемся предсказать следующий символ
Y_ = tf.placeholder(tf.uint8, [None, None], name='Y_') # [РАЗМЕР ПАКЕТА, ПОСЛЕДОВАТЕЛЬНОСТЬ]
Yo_ = tf.one_hot(Y_, ALPHASIZE, 1.0, 0.0) # [ BATCHSIZE, SEQLEN, ALPHASIZE ]# состояние ввода
Hin = tf.placeholder(tf.float32, [Нет, INTERNALSIZE*NLAYERS], name='Hin') # [ BATCHSIZE, INTERNALSIZE * NLAYERS]

используя NLAYERS=3 слоя ячеек GRU, развернув SEQLEN=30 раз# dynamic_rnn выводит SEQLEN из размера входных данных Xo

onecell = rnn.GRUCell(INTERNALSIZE)
dropcell = rnn.DropoutWrapper (onecell, input_keep_prob = pkeep)
multicell = rnn.MultiRNNCell([отбрасываемая ячейка для _ в диапазоне(NLAYERS)], state_is_tuple=False)
multicell = rnn.DropoutWrapper (multicell, output_keep_prob = pkeep)
Yr, H = tf.nn.dynamic_rnn(multicell, Xo, dtype=tf.float32, initial_state=Hin)# Yr: [ BATCHSIZE, SEQLEN, INTERNALSIZE ]# H: [ BATCHSIZE, INTERNALSIZE*NLAYERS ] # это последнее состояние в последовательности

Кажется, я не нашел никакой документации, касающейся флага повторного использования?

Заранее спасибо.


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/tensorflow/tensorflow/issues/8191#issuecomment-285702372 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/ABtim6MOOCbx3RJEJe8PQBDXGVIXTGPmks5rkW_jgaJpZM4MWl4f
.

Я не понимаю, почему я получаю эту ошибку с учебной моделью seq2seq :

cell = tf.contrib.rnn.MultiRNNCell([single_cell() for _ in range(num_layers)])

Источник

где ячейка создается с помощью

def single_cell():
    return tf.contrib.rnn.GRUCell(size)

@ebrevdo Спасибо, что вернулись к этому вопросу. К сожалению, предлагаемое изменение оставляет все как есть с вышеупомянутой ошибкой. Учитывая приведенный выше комментарий относительно учебника по seq2seq , я подозреваю, что мы все в одной лодке?

Вы уверены, что это точно такая же ошибка? Пожалуйста, скопируйте и вставьте его сюда.

Плохо, я просто снова прошел процесс изменения соответствующего кода (с нуля) и повторно запустил его, как было предложено. Ошибка действительно устранена, и у Старого Барда теперь все в порядке с галлюцинациями 👍

Итак, спасибо, не знаю, где я вчера ошибся, но это явно было на мне.

Я столкнулся с той же проблемой при использовании выпускной версии Tensorflow 1.0 и работе на MacOS в режиме процессора. Даже если добавить параметр «повторное использование»

def cell():
    return tf.contrib.rnn.BasicLSTMCell(rnn_size,state_is_tuple=True,reuse=tf.get_variable_scope().reuse)

muticell = tf.contrib.rnn.MultiRNNCell([cell for _ in range(num_layers)], state_is_tuple=True)

ваша мультиячейка выглядит неправильно... вы должны использовать "cell() для _ в
диапазон(...)"

В четверг, 16 марта 2017 г., в 20:29, [email protected] написал:

Я столкнулся с той же проблемой при использовании версии выпуска Tensorflow 1.0.
и работает на MacOS в режиме процессора. Даже если добавить параметр «повторное использование»

ячейка защиты():
вернуть tf.contrib.rnn.BasicLSTMCell(rnn_size,state_is_tuple=True,reuse=tf.get_variable_scope().reuse)

muticell = tf.contrib.rnn.MultiRNNCell([ячейка для _ в диапазоне(num_layers)], state_is_tuple=True)


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/tensorflow/tensorflow/issues/8191#issuecomment-287257629 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/ABtim3A6JQr8ptRKrdiDW_kgNRIFkHGlks5rmf4WgaJpZM4MWl4f
.

Я пытался запустить пример перевода: python2.7 translate.py --data_dir data/ --train_dir train/ --size=256 --num_layers=2 --steps_per_checkpoint=50

Кажется, способ использования MultiRNNCell правильный:
ячейка = tf.contrib.rnn.MultiRNNCell([single_cell() для _ в диапазоне(num_layers)])

Но я получил ту же ошибку:
ValueError: попытка повторного использования RNNCellс другой областью действия переменных, чем его первое использование. Первое использование ячейки было с областью действия «embedding_attention_seq2seq/embedding_attention_decoder/attention_decoder/multi_rnn_cell/cell_0/gru_cell», эта попытка — с областью действия «embedding_attention_seq2seq/rnn/multi_rnn_cell/cell_0/gru_cell». Пожалуйста, создайте новый экземпляр ячейки, если вы хотите использовать другой набор весов. Если раньше вы использовали: MultiRNNCell([GRUCell(...)] * num_layers), измените на: MultiRNNCell([GRUCell(...) for _ in range(num_layers)]). Если раньше вы использовали один и тот же экземпляр ячейки в качестве прямой и обратной ячейки двунаправленной RNN, просто создайте два экземпляра (один для прямого, один для обратного). В мае 2017 года мы начнем изменять поведение этой ячейки для использования существующих сохраненных весов, если таковые имеются, когда она вызывается с параметром scope=None (что может привести к скрытой деградации модели, поэтому эта ошибка останется до тех пор).

@bowu - тебе повезло с этим? если вы еще не пробовали, переустановите tensorflow из последнего источника. были внесены некоторые изменения в некоторые файлы core_rnn, среди некоторых других. работает для меня сейчас.

@robmsylvester Я переустанавливаю тензорный поток из последнего источника, все та же ошибка. Я был на мастере ветки, и последняя фиксация commit 2a4811054a9e6b83e1f5a2705a92aab50e151b13 . Какая последняя фиксация при создании репо?

Привет, я использую Tensorflow r1.0 с использованием графического процессора, созданного с использованием исходного кода. Я пытаюсь следовать немодифицированному руководству по переводу Seq2Seq, но получаю ту же ошибку. то есть

ValueError: попытка повторного использования RNNCellс другой областью действия переменных, чем его первое использование. Первое использование ячейки было с областью действия "embedding_attention_seq2seq/embedding_attention_decoder/attention_decoder/multi_rnn_cell/cell_0/gru_cell", эта попытка - с областью действия "embedding_attention_seq2seq/rnn/multi_rnn_cell/cell_0/gru_cell".....

Соответствующая часть кода в моем seq2seq_model.py:

 # Create the internal multi-layer cell for our RNN.
    def single_cell():
      return tf.contrib.rnn.GRUCell(size)
    if use_lstm:
      def single_cell():
        return tf.contrib.rnn.BasicLSTMCell(size)
    cell = single_cell()
    if num_layers > 1:
      cell = tf.contrib.rnn.MultiRNNCell([single_cell() for _ in range(num_layers)])

Что я могу сделать, чтобы решить проблему?

добавление «reuse=tf.get_variable_scope().reuse» к вызову, в котором создается GRUCell, не помогает.

Благодаря тонну!

@prashantserai — посмотрите, что произойдет, если вы удалите строку MultiRNNCell сверху, фактически сделав вашу сеть всего одним слоем. Тогда это работает? Это может быть ошибка где-то в MultiRNNCell. Я где-то недавно читал об этом, вероятно, при переполнении стека.

Если вы реализуете сложенный lstm/gru самостоятельно, вы не получите эту ошибку и сможете реализовать ту же функциональность (на самом деле больше, потому что вы можете делать все, что хотите, с двунаправленными архитектурами, странными остатками и пропусками соединений и т. д. .)

@robmsylvester Та же ошибка сохранялась, даже когда я пытался использовать num_layers=1, что должно фактически пропустить эту строку. Любые другие идеи? Спасибо за отзыв.

Хм. Одна вещь, которая выделяется для меня, находится в упомянутом устаревшем файле seq2seq:

encoder_cell = copy.deepcopy(cell)

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

Что произойдет, если вы явно создадите ячейку кодировщика И ячейку декодера в файле модели seq2seq и передадите их вместе с файлом устаревшей библиотеки, внеся небольшие корректировки в функции и их аргументы?

@robmsylvester не должно работать изменение областей действия ячеек? Это работает и для двух других примеров. На мой взгляд, это был бы очень уродливый обходной путь; должно существовать более чистое решение; может мы что-то упускаем? (Я также получил ту же ошибку в учебнике по seq2seq, попробовал все вышеперечисленные решения).

@ iamgroot42 - Да, это «решение», по общему признанию, очень уродливое, но в большей степени это просто попытка выяснить, где может быть проблема. Я поиграю с ним через несколько часов и посмотрю, смогу ли я что-нибудь отследить.

На самом деле, есть copy.deepcopy, потому что это устаревшие функции и
у нас нет ресурсов для их обслуживания/обновления. Если вы хотите
ввести обратно совместимое изменение, которое позволяет пользователю предоставлять
вторая ячейка для шага декодирования, и если это None, то для возврата к
deepcopy, то я был бы рад просмотреть PR. Имейте в виду, что это было бы
должны быть обратно совместимыми изменениями.

Во вторник, 4 апреля 2017 г., в 11:38, Роб Сильвестр, [email protected]
написал:

@ iamgroot42 https://github.com/iamgroot42 - Да, это «решение»
по общему признанию, очень уродливо, но тем более просто пытаюсь выследить, где проблема
возможно. Я поиграю с ним через несколько часов и посмотрю, смогу ли я что-то отследить.
вниз.


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/tensorflow/tensorflow/issues/8191#issuecomment-291593289 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/ABtim1QHTDhOC_zT6cKtmUFPOit5Yjn7ks5rso5CgaJpZM4MWl4f
.

@ebrevdo - я подумаю об этом. У меня есть транслятор, который работает очень похоже на этот, но создает ячейки через отдельный класс, который позволяет вставлять двунаправленные слои, где вы хотите, остатки, где вы хотите, объединять входные данные с concat против суммы и несколько других вещей. Я думаю, что мог бы довольно легко перенести свой класс в этот учебник, используя статические RNN. Я дам Вам знать.

@ebrevdo Я использую Tensorflow r1.0 (tensorflow-1.0.1-cp36-cp36m-linux_x86_64) на Red Hat и имею последнюю версию учебника по переводу из Github. Знаете ли вы, как заставить это работать в настоящее время?

К сожалению, учебник по переводу не работает с TF 1.0. Мы должны исправить это. @lukaszkaiser , можешь взглянуть? Мы работаем над новым руководством, но до него еще несколько недель, и для работы потребуется ночная версия TensorFlow (или TF 1.1 или 1.2).

(lukasz; мне трудно определить из различных комментариев, какая часть туториала ошибочна в TF 1.0. есть ли шанс, что вы сможете определить строку, и я могу помочь заставить ее работать?)

@ebrevdo Это учебник. Ошибка именно в этом кластере строк. Передаваемые здесь ячейки используются как для обратной, так и для прямой фазы устаревшей модели seq2seq, которая выдает ошибку из-за того, что одни и те же ячейки используются с разными областями.

@ iamgroot42 вы хотите сделать PR с необходимыми изменениями? Это было бы здорово, у меня сейчас нет циклов, чтобы сделать это самому. Спасибо!

Я заметил, что TF 1.0 отлично работает с новейшей версией учебника по переводу, если он скомпилирован из исходного кода в ветке remotes/origin/r1.0.

$ git clone https://github.com/tensorflow/tensorflow
$ cd tensorflow
$ git checkout remotes/origin/r1.0

затем соберите и установите TensorFlow, он отлично работает.

В ветке remotes/origin/r1.1 возникает ошибка «различная область видимости переменной».
Я изменил код, как предложил @robmsylvester.

Что произойдет, если вы явно создадите ячейку кодировщика И ячейку декодера в файле модели seq2seq и передадите их вместе с файлом устаревшей библиотеки, внеся небольшие корректировки в функции и их аргументы?

и это работает для меня сейчас.

@oxwsds Tensorflow, который я использую, это 1.0.1, так что, возможно, у него ошибка ..

Я попробовал то, что тогда предложил @robmsylvester на самом деле ... и обучение началось (сейчас сделано 2 дня 13 часов) ... во время декодирования происходит сбой, хотя и с ошибкой:

  File "/homes/3/serai/.conda/envs/tensorflow_r1.0_gpu/lib/python3.6/site-packages/tensorflow/contrib/legacy_seq2seq/python/ops/seq2seq.py", line 883, in embedding_attention_seq2seq
    initial_state_attention=initial_state_attention)
  File "/homes/3/serai/.conda/envs/tensorflow_r1.0_gpu/lib/python3.6/site-packages/tensorflow/contrib/legacy_seq2seq/python/ops/seq2seq.py", line 787, in embedding_attention_decoder
    initial_state_attention=initial_state_attention)
  File "/homes/3/serai/.conda/envs/tensorflow_r1.0_gpu/lib/python3.6/site-packages/tensorflow/contrib/legacy_seq2seq/python/ops/seq2seq.py", line 686, in attention_decoder
    cell_output, state = cell(x, state)
  File "/homes/3/serai/.conda/envs/tensorflow_r1.0_gpu/lib/python3.6/site-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py", line 796, in __call__
    % (len(self.state_size), state))
ValueError: Expected state to be a tuple of length 3, but received: Tensor("model_with_buckets/embedding_attention_seq2seq/rnn/gru_cell_4/add:0", shape=(?, 1024), dtype=float32)

Пробовали декодировать?

@prashantserai Точно не знаю, но то, что вы встретили, кажется другим вопросом.

@prashantserai Если это не удается только при декодировании, возможно, это как-то связано с использованием размера пакета, равного единице? Продолжает ли обучаться модель, если вы уменьшите размер партии до единицы во время обучения?

@bowu Та же ошибка. Mac OX Sierra, TensorFlow 1.1.0-rc1, Python 2.7.10 и Python 3.6.1.

@robmsylvester он также успешно обучался с размером пакета один, но произошел сбой при декодировании таким же или подобным образом ... вот полная трассировка ... причина, по которой я думал об этом как о связанной ошибке, была из-за ссылки на seq2seq_f (которая была одной из измененных функций) (комментарий #prashant из моего кода, означающий, что измененная строка является частью трассировки)

2017-04-10 11:32:27.447042: I tensorflow/core/common_runtime/gpu/gpu_device.cc:887] Found device 0 with properties: 
name: GeForce GTX 780 Ti
major: 3 minor: 5 memoryClockRate (GHz) 0.928
pciBusID 0000:42:00.0
Total memory: 2.95GiB
Free memory: 2.88GiB
2017-04-10 11:32:27.447094: I tensorflow/core/common_runtime/gpu/gpu_device.cc:908] DMA: 0 
2017-04-10 11:32:27.447102: I tensorflow/core/common_runtime/gpu/gpu_device.cc:918] 0:   Y 
2017-04-10 11:32:27.447118: I tensorflow/core/common_runtime/gpu/gpu_device.cc:977] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 780 Ti, pci bus id: 0000:42:00.0)
Traceback (most recent call last):
  File "translate.py", line 322, in <module>
    tf.app.run()
  File "/homes/3/serai/.conda/envs/tensorflow_r1.0_gpu/lib/python3.6/site-packages/tensorflow/python/platform/app.py", line 48, in run
    _sys.exit(main(_sys.argv[:1] + flags_passthrough))
  File "translate.py", line 317, in main
    decode()
  File "translate.py", line 248, in decode
    model = create_model(sess, True)
  File "translate.py", line 136, in create_model
    dtype=dtype)
  File "/data/data6/scratch/serai/models/tutorials/rnn/translate/seq2seq_model.py", line 168, in __init__
    softmax_loss_function=softmax_loss_function)
  File "/homes/3/serai/.conda/envs/tensorflow_r1.0_gpu/lib/python3.6/site-packages/tensorflow/contrib/legacy_seq2seq/python/ops/seq2seq.py", line 1203, in model_with_buckets
    decoder_inputs[:bucket[1]])
  File "/data/data6/scratch/serai/models/tutorials/rnn/translate/seq2seq_model.py", line 167, in <lambda>
    self.target_weights, buckets, lambda x, y: seq2seq_f(x, y, True),
  File "/data/data6/scratch/serai/models/tutorials/rnn/translate/seq2seq_model.py", line 144, in seq2seq_f
    dtype=dtype) #prashant
  File "/homes/3/serai/.conda/envs/tensorflow_r1.0_gpu/lib/python3.6/site-packages/tensorflow/contrib/legacy_seq2seq/python/ops/seq2seq.py", line 883, in embedding_attention_seq2seq
    initial_state_attention=initial_state_attention)
  File "/homes/3/serai/.conda/envs/tensorflow_r1.0_gpu/lib/python3.6/site-packages/tensorflow/contrib/legacy_seq2seq/python/ops/seq2seq.py", line 787, in embedding_attention_decoder
    initial_state_attention=initial_state_attention)
  File "/homes/3/serai/.conda/envs/tensorflow_r1.0_gpu/lib/python3.6/site-packages/tensorflow/contrib/legacy_seq2seq/python/ops/seq2seq.py", line 686, in attention_decoder
    cell_output, state = cell(x, state)
  File "/homes/3/serai/.conda/envs/tensorflow_r1.0_gpu/lib/python3.6/site-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py", line 796, in __call__
    % (len(self.state_size), state))
ValueError: Expected state to be a tuple of length 3, but received: Tensor("model_with_buckets/embedding_attention_seq2seq/rnn/gru_cell_4/add:0", shape=(?, 1024), dtype=float32)

@oxwsds изменилось ли ваше мнение на основе приведенной выше полной трассировки?

@prashantserai Я пробовал декодировать, и он отлично работает. Я просто добавляю аргумент encoder_cell в функцию tf.contrib.legacy_seq2seq.embedding_attention_seq2seq и в translate/seq2seq_model.py создаю ячейку и передаю ее в функцию, которая была вызвана в функции seq2seq_f . Как вы изменили свой код?

@oxwsds @robmsylvester @ebrevdo
Наконец-то у меня есть что-то, что работает сейчас (я имею в виду, что результаты для моей однослойной сети из 256 блоков ужасны, но, вероятно, это только потому, что сеть очень легкая, и я ВООБЩЕ не настраивал параметры)
Всем большое спасибо...!!!!!!

_Вот что я думаю в конце:_

Комментарий @oxwsds , что учебник (в его текущей форме) работает без каких-либо изменений, когда Tensorflow скомпилирован из ветки remotes/origin/r1.0 было TRUE . Хотя печальным моментом было то, что версия Tensorflow, которая у меня была, для которой требовались модификации в коде Tensorflow, и версия в remotes/origin/r1.0 были одинаково помечены.

Исправление @robmsylvester в комментарии (скопировано ниже) РАБОТАЛО для моей версии Tensorflow, где учебник не работал из коробки (и, я думаю, должен работать и для TF 1.1). Это немного запутано в реализации, но я мог это сделать, что о чем-то говорит :-P
Ошибка в моих последних двух комментариях до этого была из-за моей ошибки. Как манекен, я задавал параметры слоев и скрытых юнитов только во время обучения, я оставил код использовать значения по умолчанию во время декодирования. (эта часть руководства может быть немного более фиктивной: https://www.tensorflow.org/tutorials/seq2seq#lets_run_it)

Хм. Одна вещь, которая выделяется для меня, находится в упомянутом устаревшем файле seq2seq:

encoder_cell = copy.deepcopy(ячейка)

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

Что произойдет, если вы явно создадите ячейку кодировщика И ячейку декодера в файле модели seq2seq и передадите их вместе с файлом устаревшей библиотеки, внеся небольшие корректировки в функции и их аргументы?

Спасибо за ответ! Кажется, есть что-то другое между TF
на pypi и на этом теге? Гунхан, это возможно?

В понедельник, 10 апреля 2017 г., в 21:05, [email protected]
написал:

@oxwsds https://github.com/oxwsds @robmsylvester
https://github.com/robmsylvester @ebrevdo https://github.com/ebrevdo
Наконец-то у меня есть кое-что, что работает (я имею в виду результаты для моего сингла
юнит-сети уровня 256 ужасны, но это, вероятно, просто
потому что сеть очень легкая, и я ВООБЩЕ не настраивал параметры)

Вот мой итог:

@oxwsds https://github.com/oxwsds отмечает , что учебник (в немтекущая форма) работает без каких-либо изменений, когда Tensorflowскомпилированный из ветки remotes/origin/r1.0 был TRUE . Грустный бит
хотя у меня была версия Tensorflow для каких модификаций
в коде Tensorflow нужен был код, а версия в remotes/origin/r1.0
оба были одинаково маркированы.

@robmsylvester https://github.com/robmsylvester исправление в комментарии
(скопировано ниже) РАБОТАЕТ для моей версии Tensorflow, где учебник
не работал из коробки (и должен работать и для TF 1.1, я думаю). это
немного грязно реализовать, но я смог это сделать, что о чем-то говорит
:-П
Ошибка в моих последних двух комментариях до этого была из-за моей ошибки. Нравится
пустышка, я задавал только параметры слоев и скрытых юнитов
во время обучения я оставлял код для использования значений по умолчанию при декодировании. (этоЧасть учебника может быть немного более фиктивной:https://www.tensorflow.org/tutorials/seq2seq#lets_run_ithttps://www.tensorflow.org/tutorials/seq2seq#lets_run_it )

Хм. Одна вещь, которая выделяется для меня, - это ссылка на устаревший seq2seq.
файл:

encoder_cell = copy.deepcopy(ячейка)

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

Что произойдет, если вы явно создадите ячейку кодировщика И декодер
ячейку в файле модели seq2seq и передать обе в устаревшую библиотеку
файл, внося небольшие коррективы в функции и их аргументы?


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/tensorflow/tensorflow/issues/8191#issuecomment-293143828 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/ABtimxvcfFnbWbpj7aUs3BUjwGEFj6p5ks5ruvvygaJpZM4MWl4f
.

Для информации у меня возникла эта проблема при попытке сложить ячейки LSTM:
Мой исходный код был:

    lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(hidden_size, forget_bias=0.0, state_is_tuple=True)
    if is_training and keep_prob < 1:
      lstm_cell = tf.nn.rnn_cell.DropoutWrapper(
          lstm_cell, output_keep_prob=keep_prob)
    cell = tf.nn.rnn_cell.MultiRNNCell([lstm_cell] * num_layers, state_is_tuple=True)

Затем со следующим кодом создание модели было в порядке, но я не мог поделиться переменной с другой моделью. (например, если вы создадите train_model и valid_model, которые должны использовать общие тензоры, это не удастся)

    lstm_creator = lambda: tf.contrib.rnn.BasicLSTMCell(
                                        hidden_size, 
                                        forget_bias=0.0, state_is_tuple=True)
    if is_training and keep_prob < 1:
      cell_creator = lambda:tf.contrib.rnn.DropoutWrapper(
          lstm_creator(), output_keep_prob=keep_prob)
    else:
      cell_creator = lstm_creator

    cell = tf.contrib.rnn.MultiRNNCell([cell_creator() for _ in range(num_layers)], state_is_tuple=True)

Итак, наконец, я использовал lstm_creator как функцию lstm_cell в tensorflow/models/tutorials/rnn/ptb/ptb_word_lm.py#L112 . Теперь у меня есть:

def lstm_cell():
      # With the latest TensorFlow source code (as of Mar 27, 2017),
      # the BasicLSTMCell will need a reuse parameter which is unfortunately not
      # defined in TensorFlow 1.0. To maintain backwards compatibility, we add
      # an argument check here:
      if 'reuse' in inspect.getargspec(
          tf.contrib.rnn.BasicLSTMCell.__init__).args:
        return tf.contrib.rnn.BasicLSTMCell(
            size, forget_bias=0.0, state_is_tuple=True,
            reuse=tf.get_variable_scope().reuse)
      else:
        return tf.contrib.rnn.BasicLSTMCell(
            size, forget_bias=0.0, state_is_tuple=True)
    attn_cell = lstm_cell

    lstm_creator = lstm_cell
    if is_training and keep_prob < 1:
      cell_creator = lambda:tf.contrib.rnn.DropoutWrapper(
          lstm_creator(), output_keep_prob=keep_prob)
    else:
      cell_creator = lstm_creator

    cell = tf.contrib.rnn.MultiRNNCell([cell_creator() for _ in range(num_layers)], state_is_tuple=True)

Теперь он полностью рабочий

пытаюсь запустить эту штуку, что приводит к той же ошибке:

https://gist.github.com/danijar/c7ec9a30052127c7a1ad169eeb83f159#file -blog_tensorflow_sequence_classification-py-L38

Как ни странно, решение @pltrdy мне не помогло. Я получаю

ValueError: Variable rnn/multi_rnn_cell/cell_0/basic_lstm_cell/weights does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=None in VarScope?

@aep вы использовали функцию https://github.com/tensorflow/models/blob/master/tutorials/rnn/ptb/ptb_word_lm.py#L112 , которую я упоминаю в конце моего сообщения (теперь отредактировано, чтобы быть более понятным )

cells=[]
for _ in range(15):
    cell = create_lstm_cell(config)
    cells.append(cell)
lsmt_layers = rnn.MultiRNNCell(cells)

это решило мою проблему

Удалось решить эту проблему, установив более старую версию Tensorflow:
pip install -Iv tensorflow==1.0

Я получал сообщение об ошибке при выполнении руководства по seq2seq

Что касается того, что сказал @ebrevdo , я думаю, что решение состоит не в том, чтобы исправить устаревший код seq2seq, а в том, чтобы обновить руководство, чтобы вместо этого использовать пакет contrib.seq2seq , который активно поддерживается. Это очень деморализует, когда первая запущенная вами программа tensorflow выдает кучу ошибок. Если у меня будет время на этой неделе, я отправлю PR.

Мы работаем над новым учебником по seq2seq. Мы надеялись выпустить к концу
в прошлом месяце, но задерживаются. Он будет использовать новый API.

1 мая 2017 г., 8:07, «Кайл Тиг» [email protected] написал:

Что касается того, что сказал @ebrevdo https://github.com/ebrevdo , я думаю
решение состоит не в исправлении устаревшего кода seq2seq, а в обновлении
руководство по использованию вместо этого пакета contrib.seq2seq, который активно
поддерживается. Это довольно деморализует, когда первая программа с тензорным потоком, которую вы
ever run выдает кучу ошибок. Если у меня будет время на этой неделе, я
представить PR.


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/tensorflow/tensorflow/issues/8191#issuecomment-298350307 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/ABtim587xZx9Gi4-yXmwccSum8_Trc1oks5r1fUogaJpZM4MWl4f
.

@ebrevdo Я встречаю ту же ошибку при запуске модели sequence_to_sequence на веб-сайте tensorflow1.1. И я попытался использовать параметр «повторное использование», но не смог. Не могли бы вы сказать мне, когда будет выпущен новый учебник по seq2seq?

Похоже одновременно с tf 1.2, так как будем опираться на какие-то новые
особенности этого выпуска.

4 мая 2017 г., 21:16, «njuzrs» [email protected] написал:

@ebrevdo https://github.com/ebrevdo Я встречаю ту же ошибку при запуске
модель sequence_to_sequence на сайте tensorflow1.1. И я попробовал
использовать параметр «повторное использование», но не удалось. Не могли бы вы сказать мне, когда новый seq2seq
учебник будет выпущен?


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/tensorflow/tensorflow/issues/8191#issuecomment-299366774 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/ABtim8_kFTM7-SsXQAA-Ar0dfhHMGT0Zks5r2qKngaJpZM4MWl4f
.

@ebrevdo Я тоже столкнулся с той же проблемой и не могу работать с seq2seq. Будет очень полезно, если вы сообщите нам/мне, какова вероятная дата нового урока.
Спасибо большое за вашу помощь.

У меня работает установка с использованием pip install tensorflow==1.0 (Tensorflow 1.0) (учебник по переводу).

У меня версия 1.1.0-rc2.

TF1.2 решит эту проблему? Пожалуйста, помогите мне, как продолжить обучение модели. TF 1.0 работает, но не имеет API-интерфейса devicewrapper для нескольких графических процессоров.

Та же проблема с тензорным потоком 1.1. Все еще работаю над решением

Я попробовал несколько вещей, в конце концов я смог использовать tensorflow 1.1, но должен был внести следующие изменения: (на основе Tshzzz выше)

Удали это:
multicell = rnn.MultiRNNCell([dropcell]*NLAYERS, state_is_tuple=False)

И добавьте это:
ячейки=[]
для _ в диапазоне (NLAYERS):
ячейка = rnn.DropoutWrapper(tf.contrib.rnn.GRUCell(INTERNALSIZE), input_keep_prob=pkeep)
Cells.append(ячейка)
multicell = rnn.MultiRNNCell (ячейки, state_is_tuple = False)

@ebrevdo Поздравляю, TF 1.2 только что вышел — был ли где-то выпущен новый учебник или он будет выпущен в ближайшее время?

Спасибо

Мы планируем сделать анонс, когда он будет выпущен. Работаю над этим.

19 мая 2017 г., 19:02, «прашанцерай» [email protected] написал:

@ebrevdo https://github.com/ebrevdo Поздравляем, TF 1.2 только что вышел
выпущено - был ли новый учебник также выпущен где-то или он
выйдет в ближайшее время?

Спасибо


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/tensorflow/tensorflow/issues/8191#issuecomment-302844002 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/ABtim0RWDzNCXk-bIjKSyHLvgFxUvq2lks5r7km7gaJpZM4MWl4f
.

Для тех, кто использует tensorflow-gpu==1.1.0 и получает эту ошибку, переход на 1.0.0 через pip install tensorflow-gpu==1.0.0 не решит проблему, по крайней мере, у меня не сработало.

Я столкнулся с этой проблемой как на Mac, так и на Ubuntu, и компиляция из исходного кода работала оба раза. Так:
установка пипа https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.0.0-cp34-cp34m-linux_x86_64.whl

@ajaanbaahu Все еще жду нового руководства по seq2seq по tf1.2.

У меня это сработало, используя pip install tensorflow==1.0 .

Для tf r1.2 возникла ошибка глубокого копирования. Как указано в последовательности для последовательности ошибки модели № 1050

Как новичок, я высказываю свое мнение.
Следующий код вызовет аналогичную ошибку:
(Часть моего кода)

lstm_cell = self.LSTMCell(self.num_hidden)
lstm_entity = tf.contrib.rnn.DropoutWrapper(lstm_cell, output_keep_prob=0.5)
layer = tf.contrib.rnn.MultiRNNCell([lstm_entity] * self.num_layer)
__, _ = tf.nn.dynamic_rnn(layer, self.data, dtype=tf.float64)

Дамп ошибки выглядит следующим образом:

Traceback (most recent call last):
  File "IntentNet.py", line 71, in <module>
    net = Net(data, target, 5, 1)
  File "IntentNet.py", line 45, in __init__
    __, _ = tf.nn.dynamic_rnn(layer, self.data, dtype=tf.float64)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/rnn.py", line 553, in dynamic_rnn
    dtype=dtype)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/rnn.py", line 720, in _dynamic_rnn_loop
    swap_memory=swap_memory)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/control_flow_ops.py", line 2623, in while_loop
    result = context.BuildLoop(cond, body, loop_vars, shape_invariants)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/control_flow_ops.py", line 2456, in BuildLoop
    pred, body, original_loop_vars, loop_vars, shape_invariants)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/control_flow_ops.py", line 2406, in _BuildLoop
    body_result = body(*packed_vars_for_body)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/rnn.py", line 705, in _time_step
    (output, new_state) = call_cell()
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/rnn.py", line 691, in <lambda>
    call_cell = lambda: cell(input_t, state)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py", line 953, in __call__
    cur_inp, new_state = cell(cur_inp, cur_state)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py", line 713, in __call__
    output, new_state = self._cell(inputs, state, scope)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py", line 235, in __call__
    with _checked_scope(self, scope or "basic_lstm_cell", reuse=self._reuse):
  File "/usr/lib/python2.7/contextlib.py", line 17, in __enter__
    return self.gen.next()
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py", line 77, in _checked_scope
    type(cell).__name__))
ValueError: Attempt to reuse RNNCell <tensorflow.contrib.rnn.python.ops.core_rnn_cell_impl.BasicLSTMCell object at 0x7fe4fc7bd150> with a different variable scope than its first use.  First use of cell was with scope 'rnn/multi_rnn_cell/cell_0/basic_lstm_cell', this attempt is with scope 'rnn/multi_rnn_cell/cell_1/basic_lstm_cell'.  Please create a new instance of the cell if you would like it to use a different set of weights.  If before you were using: MultiRNNCell([BasicLSTMCell(...)] * num_layers), change to: MultiRNNCell([BasicLSTMCell(...) for _ in range(num_layers)]).  If before you were using the same cell instance as both the forward and reverse cell of a bidirectional RNN, simply create two instances (one for forward, one for reverse).  In May 2017, we will start transitioning this cell's behavior to use existing stored weights, if any, when it is called with scope=None (which can lead to silent model degradation, so this error will remain until then.)

Но после того, как я сделаю ревизию, это может работать.

"""
lstm_cell = self.LSTMCell(self.num_hidden)
lstm_entity = tf.contrib.rnn.DropoutWrapper(lstm_cell, output_keep_prob=0.5)
layer = tf.contrib.rnn.MultiRNNCell([lstm_entity] * self.num_layer)
"""
layer = []
for i in range(self.num_layer):
    lstm_cell = self.LSTMCell(self.num_hidden)
    lstm_entity = tf.contrib.rnn.DropoutWrapper(lstm_cell, output_keep_prob=0.5)
    layer.append(lstm_entity)
layer = tf.contrib.rnn.MultiRNNCell(layer)
__, _ = tf.nn.dynamic_rnn(layer, self.data, dtype=tf.float64)

Ни один из этих обходных путей не работал у меня с Tensorflow 1.1.

Я использую модель $#$ seq2seq MultiRNNCell .

Мне пришлось вернуться к 1.0.1: pip3 install tensorflow==1.0

У кого-нибудь есть эти проблемы при работе с legacy_seq2seq.rnn_decoder()?

@oxwsds Как вы сказали, я меняю ячейку входных аргументов tf.contrib.legacy_seq2seq.embedding_attention_seq2seq на две разные ячейки {encoder_cells, decoder_cells}. Наконец, у меня работает модель seq2seq. После 73200 сетпс получаю недоумение 5.54.
Затем я запускаю часть декодирования,

Кто является президентом Соединенных Штатов?
Qui est le président des États-Unis?

Проблема решена. Спасибо.

@doncat99
Кажется, что copy.deepcopy(cell) в seq2seq.py не действует.
Поэтому я меняю соответствующую часть в seq2seq_model.py на

if num_layers > 1:
      cell_enc = tf.contrib.rnn.MultiRNNCell([single_cell() for _ in range(num_layers)])
      cell_dec = tf.contrib.rnn.MultiRNNCell([single_cell() for _ in range(num_layers)])

    # The seq2seq function: we use embedding for the input and attention.
    def seq2seq_f(encoder_inputs, decoder_inputs, do_decode):
      return seq2seq.embedding_attention_seq2seq(
          encoder_inputs,
          decoder_inputs,
          cell_enc,
          cell_dec,
          num_encoder_symbols=source_vocab_size,
          num_decoder_symbols=target_vocab_size,
          embedding_size=size,
          output_projection=output_projection,
          feed_previous=do_decode,
          dtype=dtype)

@supermeatboy82 , не могли бы вы поделиться своим кодом?

Обновление до Tensorflow 1.2.0 и генерация ячеек в цикле вместо умножения списка исправили это для меня.

Получил ошибку с TF1.2 при запуске translate.py, подробности:
название: GeForce GTX 1080 Ti
старший: 6 младший: 1 memoryClockRate (ГГц) 1,582
pciBusID 0000:02:00.0
Общая память: 10,91 ГБ
Свободная память: 10,76 ГБ
22.06.2017, 09:15:04.485252: я тензорный поток/ядро/common_runtime/gpu/gpu_device.cc:961] DMA: 0
22.06.2017, 09:15:04.485256: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971] 0: Y
2017-06-22 09:15:04.485265: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Создание устройства TensorFlow (/gpu:0) -> (устройство: 0, имя: GeForce GTX 1080 Ti, pci идентификатор шины: 0000:02:00.0)
Создание 3 слоев по 1024 единицы.
Traceback (последний последний вызов):
Файл "translate.py", строка 322, в
tf.app.run()
Файл "/home/lscm/opt/anaconda2/lib/python2.7/site-packages/tensorflow/python/platform/app.py", строка 48, выполняется
_sys.exit(main(_sys.argv[:1] + flags_passthrough))
Файл "translate.py", строка 319, в основном
тренироваться()
Файл "translate.py", строка 178, в поезде
модель = create_model (sess, ложь)
Файл "translate.py", строка 136, в create_model
дтип=дтип)
Файл "/data/research/github/dl/tensorflow/tensorflow/models/tutorials/rnn/translate/seq2seq_model.py", строка 179, в __init__
softmax_loss_function=softmax_loss_function)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/site-packages/tensorflow/contrib/legacy_seq2seq/python/ops/seq2seq.py", строка 1206, в model_with_buckets
decoder_inputs[:bucket[1]])
Файл "/data/research/github/dl/tensorflow/tensorflow/models/tutorials/rnn/translate/seq2seq_model.py", строка 178, в
лямбда x, y: seq2seq_f (x, y, False),
Файл "/data/research/github/dl/tensorflow/tensorflow/models/tutorials/rnn/translate/seq2seq_model.py", строка 142, в seq2seq_f
дтип=дтип)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/site-packages/tensorflow/contrib/legacy_seq2seq/python/ops/seq2seq.py", строка 848, в embedding_attention_seq2seq
encoder_cell = copy.deepcopy(ячейка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 174, в deepcopy
y = копир (памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/site-packages/tensorflow/python/layers/base.py", строка 476, в __deepcopy__
setattr (результат, k, copy.deepcopy (v, памятка))
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 163, в deepcopy
y = копировальный аппарат (x, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 230, в _deepcopy_list
y.append (глубокая копия (а, памятка))
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 190, в глубоком копировании
y = _reconstruct(x, rv, 1, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 334, в _reconstruct
состояние = глубокая копия (состояние, заметка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 163, в deepcopy
y = копировальный аппарат (x, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 257, в _deepcopy_dict
y[deepcopy(ключ, памятка)] = deepcopy(значение, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 190, в глубоком копировании
y = _reconstruct(x, rv, 1, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 334, в _reconstruct
состояние = глубокая копия (состояние, заметка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 163, в deepcopy
y = копировальный аппарат (x, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 257, в _deepcopy_dict
y[deepcopy(ключ, памятка)] = deepcopy(значение, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 190, в глубоком копировании
y = _reconstruct(x, rv, 1, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 334, в _reconstruct
состояние = глубокая копия (состояние, заметка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 163, в deepcopy
y = копировальный аппарат (x, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 257, в _deepcopy_dict
y[deepcopy(ключ, памятка)] = deepcopy(значение, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 190, в глубоком копировании
y = _reconstruct(x, rv, 1, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 334, в _reconstruct
состояние = глубокая копия (состояние, заметка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 163, в deepcopy
y = копировальный аппарат (x, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 257, в _deepcopy_dict
y[deepcopy(ключ, памятка)] = deepcopy(значение, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 163, в deepcopy
y = копировальный аппарат (x, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 257, в _deepcopy_dict
y[deepcopy(ключ, памятка)] = deepcopy(значение, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 163, в deepcopy
y = копировальный аппарат (x, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 230, в _deepcopy_list
y.append (глубокая копия (а, памятка))
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 190, в глубоком копировании
y = _reconstruct(x, rv, 1, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 334, в _reconstruct
состояние = глубокая копия (состояние, заметка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 163, в deepcopy
y = копировальный аппарат (x, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 257, в _deepcopy_dict
y[deepcopy(ключ, памятка)] = deepcopy(значение, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 190, в глубоком копировании
y = _reconstruct(x, rv, 1, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 334, в _reconstruct
состояние = глубокая копия (состояние, заметка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 163, в deepcopy
y = копировальный аппарат (x, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 257, в _deepcopy_dict
y[deepcopy(ключ, памятка)] = deepcopy(значение, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 190, в глубоком копировании
y = _reconstruct(x, rv, 1, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 334, в _reconstruct
состояние = глубокая копия (состояние, заметка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 163, в deepcopy
y = копировальный аппарат (x, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 257, в _deepcopy_dict
y[deepcopy(ключ, памятка)] = deepcopy(значение, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 163, в deepcopy
y = копировальный аппарат (x, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 230, в _deepcopy_list
y.append (глубокая копия (а, памятка))
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 163, в deepcopy
y = копировальный аппарат (x, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 237, в _deepcopy_tuple
y.append (глубокая копия (а, памятка))
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 163, в deepcopy
y = копировальный аппарат (x, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 257, в _deepcopy_dict
y[deepcopy(ключ, памятка)] = deepcopy(значение, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 190, в глубоком копировании
y = _reconstruct(x, rv, 1, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 334, в _reconstruct
состояние = глубокая копия (состояние, заметка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 163, в deepcopy
y = копировальный аппарат (x, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 257, в _deepcopy_dict
y[deepcopy(ключ, памятка)] = deepcopy(значение, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 190, в глубоком копировании
y = _reconstruct(x, rv, 1, памятка)
Файл "/home/lscm/opt/anaconda2/lib/python2.7/copy.py", строка 343, в _reconstruct
y.__dict__.update(состояние)
AttributeError: объект «NoneType» не имеет атрибута «обновление»

Я также столкнулся с ошибкой, вызванной copy.deepcopy(cell) в embedding_attention_seq2seq() при запуске self_test() в модели перевода в учебнике.
Я попытался изменить коды в seq2seq_f() в Seq2SeqModel следующим образом:

    def seq2seq_f(encoder_inputs, decoder_inputs, do_decode=False):
        tmp_cell = copy.deepcopy(cell) #new
        return tf.contrib.legacy_seq2seq.embedding_attention_seq2seq(
            encoder_inputs,
            decoder_inputs,
            tmp_cell, #new
            num_encoder_symbols=source_vocab_size,
            num_decoder_symbols=target_vocab_size,
            embedding_size=size,
            output_projection=output_projection,
            feed_previous=do_decode,
            dtype=dtype)

Тогда ошибки сейчас нет.
НО, как новичок, я не знаю, работают ли здесь коды, как раньше, и кажется, что изменения замедляют работу модели.

Я хотел бы сообщить всем, что я понизил версию tensorflow до 1.0.0 (tensorflow-GPU), и она у меня работает. Модели работают так, как ожидалось. Я предполагаю, что версия процессора 1.0.0 должна работать должным образом? Или?.
Спасибо :)

Привет, ребята, я не знаю, интересно ли вам это, но я обнаружил, что проблема связана с операцией копирования ячейки, переданной в качестве параметров функции embedding_attention_seq2seq . Это связано с тем, что одно и то же определение ячейки используется как для кодировщика, так и для декодера. Я думаю, что руководство устарело, поскольку в нем используется модель seq2seq с группировкой, в отличие от динамического seq2seq. Но я вставляю модифицированную функцию, которая работает. Функция обновлена ​​в файле tensorflow/contrib/legacy_seq2seq/python/ops/seq2seq.py .

Благодарность,
Фабио

```!питон
def embedding_attention_seq2seq (encoder_inputs,
декодер_входы,
enc_cell,
dec_cell,
num_encoder_symbols,
num_decoder_symbols,
embedding_size,
число_голов = 1,
output_projection = Нет,
feed_previous = Ложь,
dtype = Нет,
сфера = нет,
initial_state_attention = Ложь):
"""Внедрение модели последовательностей с вниманием.

Эта модель сначала встраивает encoder_inputs вновь созданным вложением (формы
[количество символов кодировщика x размер_ввода]). Затем он запускает RNN для кодирования
встроенные encoder_inputs в вектор состояния. Он сохраняет выходные данные этого
RNN на каждом шагу, чтобы потом использовать для внимания. Затем он встраивает decoder_inputs
другим вновь созданным вложением (формы [num_decoder_symbols x
input_size]). Затем он запускает декодер внимания, инициализированный последним
состояние кодировщика на встроенных входных данных decoder_inputs и на выходах кодировщика.

Предупреждение: когда output_projection имеет значение None, размер векторов внимания
и переменные будут сделаны пропорциональными num_decoder_symbols, могут быть большими.

Аргументы:
encoder_inputs: список одномерных тензоров int32 формы [batch_size].
decoder_inputs: список одномерных тензоров int32 формы [batch_size].
ячейка: tf.nn.rnn_cell.RNNCell, определяющая функцию и размер ячейки.
num_encoder_symbols: целое число; количество символов на стороне энкодера.
num_decoder_symbols: целое число; количество символов на стороне декодера.
embedding_size: целое число, длина вектора встраивания для каждого символа.
num_heads: количество заголовков внимания, которые читаются из warning_states.
output_projection: нет или пара (W, B) выходных весов проекций и
предубеждения; W имеет форму [output_size x num_decoder_symbols], а B имеет
форма [num_decoder_symbols]; если указано и feed_previous=True, каждый
поданный предыдущий вывод сначала будет умножен на W и добавлен B.
feed_previous: логический или скалярный логический тензор; если True, то только первый
будет использоваться decoder_inputs (символ «GO»), а все остальные декодеры
входные данные будут взяты из предыдущих выходных данных (как в embedding_rnn_decoder).
Если False, decoder_inputs используются как заданные (стандартный случай декодера).
dtype: dtype начального состояния RNN (по умолчанию: tf.float32).
scope: VariableScope для созданного подграфа; по умолчанию
"вложение_внимания_seq2seq".
initial_state_attention: если False (по умолчанию), начальное внимание равно нулю.
Если True, инициализируйте внимание из начального состояния и внимания.
состояния.

Возвращает:
Кортеж вида (выходы, состояние), где:
outputs: список той же длины, что и decoder_inputs 2D-тензоров с
форма [batch_size x num_decoder_symbols], содержащая сгенерированный
выходы.
состояние: состояние каждой ячейки декодера на последнем временном шаге.
Это двумерный тензор формы [batch_size x cell.state_size].
"""
с переменной_scope.variable_scope(
область действия или "embedding_attention_seq2seq", dtype=dtype) в качестве области действия:
dtype = область.dtype
# Кодировщик.

encoder_cell = enc_cell

encoder_cell = core_rnn_cell.EmbeddingWrapper(
    encoder_cell,
    embedding_classes=num_encoder_symbols,
    embedding_size=embedding_size)
encoder_outputs, encoder_state = rnn.static_rnn(
    encoder_cell, encoder_inputs, dtype=dtype)

# First calculate a concatenation of encoder outputs to put attention on.
top_states = [
    array_ops.reshape(e, [-1, 1, encoder_cell.output_size]) for e in encoder_outputs
]
attention_states = array_ops.concat(top_states, 1)

# Decoder.
output_size = None
if output_projection is None:
  dec_cell = core_rnn_cell.OutputProjectionWrapper(dec_cell, num_decoder_symbols)
  output_size = num_decoder_symbols

if isinstance(feed_previous, bool):
  return embedding_attention_decoder(
      decoder_inputs,
      encoder_state,
      attention_states,
      dec_cell,
      num_decoder_symbols,
      embedding_size,
      num_heads=num_heads,
      output_size=output_size,
      output_projection=output_projection,
      feed_previous=feed_previous,
      initial_state_attention=initial_state_attention)

# If feed_previous is a Tensor, we construct 2 graphs and use cond.
def decoder(feed_previous_bool):
  reuse = None if feed_previous_bool else True
  with variable_scope.variable_scope(
      variable_scope.get_variable_scope(), reuse=reuse):
    outputs, state = embedding_attention_decoder(
        decoder_inputs,
        encoder_state,
        attention_states,
        dec_cell,
        num_decoder_symbols,
        embedding_size,
        num_heads=num_heads,
        output_size=output_size,
        output_projection=output_projection,
        feed_previous=feed_previous_bool,
        update_embedding_for_previous=False,
        initial_state_attention=initial_state_attention)
    state_list = [state]
    if nest.is_sequence(state):
      state_list = nest.flatten(state)
    return outputs + state_list

outputs_and_state = control_flow_ops.cond(feed_previous,
                                          lambda: decoder(True),
                                          lambda: decoder(False))
outputs_len = len(decoder_inputs)  # Outputs length same as decoder inputs.
state_list = outputs_and_state[outputs_len:]
state = state_list[0]
if nest.is_sequence(encoder_state):
  state = nest.pack_sequence_as(
      structure=encoder_state, flat_sequence=state_list)
return outputs_and_state[:outputs_len], state

```

@fabiofumarola Спасибо за функцию. Выглядит действительно полезно. Я также видел, что учебник устарел. Я все еще жду официального релиза учебника. Похоже, вы использовали новый API. У вас есть какой-нибудь код, который можно найти, чтобы начать кодировать новый API?
Любая помощь приветствуется. Еще раз, спасибо :)

@ syw2014 Вы исправили свою проблему?

@ w268wang еще нет, все еще жду других решений, но комментарии @Miopas могут попробовать, и я пробую решение @fabiofumarola

там написано TypeError: embedding_attention_seq2seq() missing 1 required positional argument: 'dec_cell'
после использования обновления, опубликованного @fabiofumarola . Не могли бы вы, ребята, помочь мне?

Да, потому что обновление, которое я предложил, требует, чтобы вы изменили
embedding_attention_seq2seq Функция. Если вы перейдете к исходному файлу в вас
tensorflow, вы можете изменить определение метода, которое вы сами.

Вс, 2 июля 2017 г., 18:15, [email protected] .

он говорит TypeError: embedding_attention_seq2seq() отсутствует 1 требуется
позиционный аргумент: 'dec_cell'


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/tensorflow/tensorflow/issues/8191#issuecomment-312500996 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/ABepUEc3W8m5CVDQGnCLu4dcJVFwwLDZks5sJ8IOgaJpZM4MWl4f
.

>

Отправлено с мобильного Gmail

Да я сделал то же самое. Я изменил функцию в файле seq2seq.py в выпуске tensorflow. Тем не менее я получаю ту же ошибку. Есть ли еще один аргумент у функции?

Да, теперь в вашем коде нужно указать rnn_cells. Один для энкодера
и еще один для декодера.

В воскресенье, 2 июля 2017 г., в 20:54, fabio fumarola [email protected] написал:

да

В воскресенье, 2 июля 2017 г., в 18:50, [email protected] написал:

Да я сделал то же самое. Я изменил функцию в файле seq2seq.py в
выпуск тензорного потока. Тем не менее я получаю ту же ошибку. Есть ли один
больше аргумента функции?


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/tensorflow/tensorflow/issues/8191#issuecomment-312503106 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/ABepUOXTQC_mzLuhcwW0iZRVkLmmr8yIks5sJ8pugaJpZM4MWl4f
.

>

Отправлено с мобильного Gmail

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

`
из __future__ импортировать absolute_import
из __future__ импортного подразделения
из __future__ импортировать print_function

импортировать случайный

импортировать numpy как np
from six.moves import xrange # pylint: disable=redefined-builtin
импортировать тензорный поток как tf

импортировать data_utils

класс Seq2SeqModel (объект):
def __init__(я,
исходный_вокаб_размер,
target_vocab_size,
ведра,
размер,
количество_слоев,
макс_градиент_норма,
размер партии,
скорость_обучения,
Learning_rate_decay_factor,
use_lstm = Ложь,
число_выборок = 512,
forward_only = Ложь,
dtype=tf.float32):

self.source_vocab_size = source_vocab_size
self.target_vocab_size = target_vocab_size
self.buckets = buckets
self.batch_size = batch_size
self.learning_rate = tf.Variable(
    float(learning_rate), trainable=False, dtype=dtype)
self.learning_rate_decay_op = self.learning_rate.assign(
    self.learning_rate * learning_rate_decay_factor)
self.global_step = tf.Variable(0, trainable=False)


output_projection = None
softmax_loss_function = None

if num_samples > 0 and num_samples < self.target_vocab_size:
  w_t = tf.get_variable("proj_w", [self.target_vocab_size, size], dtype=dtype)
  w = tf.transpose(w_t)
  b = tf.get_variable("proj_b", [self.target_vocab_size], dtype=dtype)
  output_projection = (w, b)

  def sampled_loss(labels, inputs):
    labels = tf.reshape(labels, [-1, 1])

    local_w_t = tf.cast(w_t, tf.float32)
    local_b = tf.cast(b, tf.float32)
    local_inputs = tf.cast(inputs, tf.float32)
    return tf.cast(
        tf.nn.sampled_softmax_loss(local_w_t, local_b, local_inputs, labels,
                                   num_samples, self.target_vocab_size),
        dtype)
  softmax_loss_function = sampled_loss


def single_cell():
  return tf.nn.rnn_cell.GRUCell(size)
if use_lstm:
  def single_cell():
    return tf.nn.rnn_cell.BasicLSTMCell(size)
cell = single_cell()
if num_layers > 1:
  cell = tf.nn.rnn_cell.MultiRNNCell([single_cell() for _ in range(num_layers)])


def seq2seq_f(encoder_inputs, decoder_inputs, do_decode):
  return tf.contrib.legacy_seq2seq.embedding_attention_seq2seq(
      encoder_inputs,
      decoder_inputs,
      cell,
      num_encoder_symbols=source_vocab_size,
      num_decoder_symbols=target_vocab_size,
      embedding_size=size,
      output_projection=output_projection,
      feed_previous=do_decode,
      dtype=dtype)


self.encoder_inputs = []
self.decoder_inputs = []
self.target_weights = []
for i in xrange(buckets[-1][0]):  # Last bucket is the biggest one.
  self.encoder_inputs.append(tf.placeholder(tf.int32, shape=[None],
                                            name="encoder{0}".format(i)))
for i in xrange(buckets[-1][1] + 1):
  self.decoder_inputs.append(tf.placeholder(tf.int32, shape=[None],
                                            name="decoder{0}".format(i)))
  self.target_weights.append(tf.placeholder(dtype, shape=[None],
                                            name="weight{0}".format(i)))

# Our targets are decoder inputs shifted by one.
targets = [self.decoder_inputs[i + 1]
           for i in xrange(len(self.decoder_inputs) - 1)]

# Training outputs and losses.
if forward_only:
  self.outputs, self.losses = tf.contrib.legacy_seq2seq.model_with_buckets(
      self.encoder_inputs, self.decoder_inputs, targets,
      self.target_weights, buckets, lambda x, y: seq2seq_f(x, y, True),
      softmax_loss_function=softmax_loss_function)
  # If we use output projection, we need to project outputs for decoding.
  if output_projection is not None:
    for b in xrange(len(buckets)):
      self.outputs[b] = [
          tf.matmul(output, output_projection[0]) + output_projection[1]
          for output in self.outputs[b]
      ]
else:
  self.outputs, self.losses = tf.contrib.legacy_seq2seq.model_with_buckets(
      self.encoder_inputs, self.decoder_inputs, targets,
      self.target_weights, buckets,
      lambda x, y: seq2seq_f(x, y, False),
      softmax_loss_function=softmax_loss_function)

# Gradients and SGD update operation for training the model.
params = tf.trainable_variables()
if not forward_only:
  self.gradient_norms = []
  self.updates = []
  opt = tf.train.GradientDescentOptimizer(self.learning_rate)
  for b in xrange(len(buckets)):
    gradients = tf.gradients(self.losses[b], params)
    clipped_gradients, norm = tf.clip_by_global_norm(gradients,
                                                     max_gradient_norm)
    self.gradient_norms.append(norm)
    self.updates.append(opt.apply_gradients(
        zip(clipped_gradients, params), global_step=self.global_step))

self.saver = tf.train.Saver(tf.global_variables())

шаг определения (я, сеанс, encoder_inputs, decoder_inputs, target_weights,
ведро_id, вперед_только):

# Check if the sizes match.
encoder_size, decoder_size = self.buckets[bucket_id]
if len(encoder_inputs) != encoder_size:
  raise ValueError("Encoder length must be equal to the one in bucket,"
                   " %d != %d." % (len(encoder_inputs), encoder_size))
if len(decoder_inputs) != decoder_size:
  raise ValueError("Decoder length must be equal to the one in bucket,"
                   " %d != %d." % (len(decoder_inputs), decoder_size))
if len(target_weights) != decoder_size:
  raise ValueError("Weights length must be equal to the one in bucket,"
                   " %d != %d." % (len(target_weights), decoder_size))

# Input feed: encoder inputs, decoder inputs, target_weights, as provided.
input_feed = {}
for l in xrange(encoder_size):
  input_feed[self.encoder_inputs[l].name] = encoder_inputs[l]
for l in xrange(decoder_size):
  input_feed[self.decoder_inputs[l].name] = decoder_inputs[l]
  input_feed[self.target_weights[l].name] = target_weights[l]

# Since our targets are decoder inputs shifted by one, we need one more.
last_target = self.decoder_inputs[decoder_size].name
input_feed[last_target] = np.zeros([self.batch_size], dtype=np.int32)

# Output feed: depends on whether we do a backward step or not.
if not forward_only:
  output_feed = [self.updates[bucket_id],  # Update Op that does SGD.
                 self.gradient_norms[bucket_id],  # Gradient norm.
                 self.losses[bucket_id]]  # Loss for this batch.
else:
  output_feed = [self.losses[bucket_id]]  # Loss for this batch.
  for l in xrange(decoder_size):  # Output logits.
    output_feed.append(self.outputs[bucket_id][l])

outputs = session.run(output_feed, input_feed)
if not forward_only:
  return outputs[1], outputs[2], None  # Gradient norm, loss, no outputs.
else:
  return None, outputs[0], outputs[1:]  # No gradient norm, loss, outputs.

def get_batch (я, данные, Bucket_id):

encoder_size, decoder_size = self.buckets[bucket_id]
encoder_inputs, decoder_inputs = [], []

# Get a random batch of encoder and decoder inputs from data,
# pad them if needed, reverse encoder inputs and add GO to decoder.
for _ in xrange(self.batch_size):
  encoder_input, decoder_input = random.choice(data[bucket_id])

  # Encoder inputs are padded and then reversed.
  encoder_pad = [data_utils.PAD_ID] * (encoder_size - len(encoder_input))
  encoder_inputs.append(list(reversed(encoder_input + encoder_pad)))

  # Decoder inputs get an extra "GO" symbol, and are padded then.
  decoder_pad_size = decoder_size - len(decoder_input) - 1
  decoder_inputs.append([data_utils.GO_ID] + decoder_input +
                        [data_utils.PAD_ID] * decoder_pad_size)

# Now we create batch-major vectors from the data selected above.
batch_encoder_inputs, batch_decoder_inputs, batch_weights = [], [], []

# Batch encoder inputs are just re-indexed encoder_inputs.
for length_idx in xrange(encoder_size):
  batch_encoder_inputs.append(
      np.array([encoder_inputs[batch_idx][length_idx]
                for batch_idx in xrange(self.batch_size)], dtype=np.int32))

# Batch decoder inputs are re-indexed decoder_inputs, we create weights.
for length_idx in xrange(decoder_size):
  batch_decoder_inputs.append(
      np.array([decoder_inputs[batch_idx][length_idx]
                for batch_idx in xrange(self.batch_size)], dtype=np.int32))

  # Create target_weights to be 0 for targets that are padding.
  batch_weight = np.ones(self.batch_size, dtype=np.float32)
  for batch_idx in xrange(self.batch_size):
    # We set weight to 0 if the corresponding target is a PAD symbol.
    # The corresponding target is decoder_input shifted by 1 forward.
    if length_idx < decoder_size - 1:
      target = decoder_inputs[batch_idx][length_idx + 1]
    if length_idx == decoder_size - 1 or target == data_utils.PAD_ID:
      batch_weight[batch_idx] = 0.0
  batch_weights.append(batch_weight)
return batch_encoder_inputs, batch_decoder_inputs, batch_weights`

Это хороший вопрос для переполнения стека.

3 июля 2017 г., 8:46, «sachinh35» [email protected] написал:

Я совершенно новичок в этом. Может быть, это довольно простой вопрос, но не могли бы вы
подскажите какой аргумент нужно передать в качестве ячейки декодера в этом коде? я
пытаясь разработать seq2seq, как показано в учебнике по тензорному потоку, используя собственный
набор данных.
`# Copyright 2015 Авторы TensorFlow. Все права защищены.
Под лицензией Apache License, версия 2.0 («Лицензия»); ты можешь
не используйте этот файл, кроме как в соответствии с Лицензией. Вы можете получить
копия Лицензии на http://www.apache.org/licenses/LICENSE-2.0 Если
требуется применимым законодательством или согласовано в письменной форме, программное обеспечение распространяется
по Лицензии распространяется на условиях «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ
ИЛИ УСЛОВИЯ ЛЮБОГО РОДА, явные или подразумеваемые. См. Лицензию на
конкретный язык, управляющий разрешениями и ограничениями в соответствии с

Лицензия. ================================================== ==========

"""Последовательная модель с механизмом внимания."""

из будущего импорта absolute_import
из будущего импортного подразделения
из будущего импорта print_function

импортировать случайный

импортировать numpy как np
from six.moves import xrange # pylint: disable=redefined-builtin
импортировать тензорный поток как tf

импортировать data_utils

класс Seq2SeqModel (объект):
"""Последовательная модель с вниманием и для нескольких сегментов.

Этот класс реализует многослойную рекуррентную нейронную сеть в качестве кодировщика,
и декодер на основе внимания. Это то же самое, что и модель, описанная в
этот документ: http://arxiv.org/abs/1412.7449 - пожалуйста, поищите там
Детали,
или в библиотеку seq2seq для полной реализации модели.
Этот класс также позволяет использовать ячейки GRU в дополнение к ячейкам LSTM, и
выборка softmax для обработки большого размера выходного словаря. однослойный
вариант этой модели, но с двунаправленным энкодером, был представлен в
http://arxiv.org/abs/1409.0473
и выборка softmax описана в разделе 3 следующей статьи.
http://arxiv.org/abs/1412.2007
"""

определение инициализации (я,
исходный_вокаб_размер,
target_vocab_size,
ведра,
размер,
количество_слоев,
макс_градиент_норма,
размер партии,
скорость_обучения,
Learning_rate_decay_factor,
use_lstm = Ложь,
число_выборок = 512,
forward_only = Ложь,
dtype=tf.float32):
"""Создайте модель.

Аргументы:
source_vocab_size: размер исходного словаря.
target_vocab_size: размер целевого словаря.
ведра: список пар (I, O), где I указывает максимальную длину ввода
которые будут обрабатываться в этом сегменте, а O указывает максимальный вывод
длина. Учебные экземпляры, которые имеют входные данные длиннее I или выходные данные
длиннее, чем O, будет перемещен в следующее ведро и соответствующим образом дополнен.
Мы предполагаем, что список отсортирован, например, [(2, 4), (8, 16)].
размер: количество единиц в каждом слое модели.
num_layers: количество слоев в модели.
max_gradient_norm: градиенты будут обрезаны максимально до этой нормы.
batch_size: размер пакетов, используемых во время обучения;
построение модели не зависит от batch_size, поэтому его можно
изменяется после инициализации, если это удобно, например, для декодирования.
Learning_rate: начальная скорость обучения.
Learning_rate_decay_factor: уменьшать скорость обучения на столько, когда это необходимо.
use_lstm: если true, мы используем ячейки LSTM вместо ячеек GRU.
num_samples: количество семплов для softmax.
forward_only: если установлено, мы не строим обратный проход в модели.
dtype: тип данных для хранения внутренних переменных.
"""
self.source_vocab_size = исходный_vocab_size
self.target_vocab_size = target_vocab_size
self.buckets = ведра
self.batch_size = размер_пакета
self.learning_rate = tf.Variable(
float (learning_rate), обучаемый = False, dtype = dtype)
self.learning_rate_decay_op = self.learning_rate.assign(
self.learning_rate * Learning_rate_decay_factor)
self.global_step = tf.Variable (0, обучаемый = False)

Если мы используем выборку softmax, нам нужна выходная проекция.

output_projection = Нет
softmax_loss_function = Нет

Sampled softmax имеет смысл только в том случае, если мы сэмплируем меньше размера словаря.

если num_samples > 0 и num_samples < self.target_vocab_size:
w_t = tf.get_variable("proj_w", [self.target_vocab_size, размер], dtype=dtype)
w = tf.transpose (w_t)
b = tf.get_variable("proj_b", [self.target_vocab_size], dtype=dtype)
выход_проекция = (ш, б)

def sampled_loss (метки, входы):
метки = tf.reshape (метки, [-1, 1])
# Нам нужно вычислить sampled_softmax_loss, используя 32-битные числа с плавающей запятой, чтобы
# избегайте численной нестабильности.
local_w_t = tf.cast(w_t, tf.float32)
local_b = tf.cast(b, tf.float32)
local_inputs = tf.cast (входы, tf.float32)
вернуть tf.cast(
tf.nn.sampled_softmax_loss(local_w_t, local_b, local_inputs, метки,
num_samples, self.target_vocab_size),
тип)
softmax_loss_function = выборочная_потеря

Создайте внутреннюю многослойную ячейку для нашей RNN.

определение single_cell():
вернуть tf.nn.rnn_cell.GRUCell(размер)
если использовать_lstm:
определение single_cell():
вернуть tf.nn.rnn_cell.BasicLSTMCell (размер)
ячейка = одиночная_ячейка()
если число_слоев > 1:
ячейка = tf.nn.rnn_cell.MultiRNNCell([single_cell() для _ в диапазоне(num_layers)])

Функция seq2seq: мы используем встраивание для ввода и внимания.

def seq2seq_f (кодировщик_входы, декодер_входы, do_decode):
вернуть tf.contrib.legacy_seq2seq.embedding_attention_seq2seq(
encoder_inputs,
декодер_входы,
клетка,
num_encoder_symbols = source_vocab_size,
num_decoder_symbols = target_vocab_size,
embedding_size = размер,
output_projection = output_projection,
feed_previous=do_decode,
дтип=дтип)

Фиды для входов.

self.encoder_inputs = []
self.decoder_inputs = []
self.target_weights = []
for i in xrange(buckets[-1][0]): # Последняя корзина самая большая.
self.encoder_inputs.append (tf.placeholder (tf.int32, shape = [Нет],
name="кодер{0}".format(i)))
для i в xrange (buckets [-1] [1] + 1):
self.decoder_inputs.append (tf.placeholder (tf.int32, shape = [Нет],
name="декодер{0}".format(i)))
self.target_weights.append (tf.placeholder (dtype, shape = [Нет],
имя="вес{0}".формат(я)))

Нашими целями являются входные данные декодера, сдвинутые на единицу.

цели = [self.decoder_inputs[i + 1]
для i в xrange (len (self.decoder_inputs) - 1)]

Учебные результаты и потери.

если только вперед:
self.outputs, self.losses = tf.contrib.legacy_seq2seq.model_with_buckets(
self.encoder_inputs, self.decoder_inputs, цели,
self.target_weights, ведра, лямбда x, y: seq2seq_f (x, y, True),
softmax_loss_function=softmax_loss_function)
# Если мы используем выходную проекцию, нам нужно проецировать выходные данные для декодирования.
если output_projection не None:
для b в xrange (len (buckets)):
self.outputs[b] = [
tf.matmul (выход, output_projection [0]) + output_projection [1]
для вывода в self.outputs[b]
]
еще:
self.outputs, self.losses = tf.contrib.legacy_seq2seq.model_with_buckets(
self.encoder_inputs, self.decoder_inputs, цели,
self.target_weights, ведра,
лямбда x, y: seq2seq_f (x, y, False),
softmax_loss_function=softmax_loss_function)

Градиенты и операция обновления SGD для обучения модели.

параметры = tf.trainable_variables()
если не только вперед:
self.gradient_norms = []
self.updates = []
opt = tf.train.GradientDescentOptimizer (self.learning_rate)
для b в xrange (len (buckets)):
градиенты = tf.gradients (self.losses [b], параметры)
clipped_gradients, norm = tf.clip_by_global_norm (градиенты,
макс_градиент_норма)
self.gradient_norms.append (норма)
self.updates.append(opt.apply_gradients(
zip (обрезанные_градиенты, параметры), global_step = self.global_step))

self.saver = tf.train.Saver (tf.global_variables ())

шаг определения (я, сеанс, encoder_inputs, decoder_inputs, target_weights,
ведро_id, вперед_только):
"""Выполните шаг модели, подающей заданные входные данные.

Аргументы:
session: сеанс tensorflow для использования.
encoder_inputs: список векторов numpy int для подачи в качестве входных данных кодировщика.
decoder_inputs: список векторов numpy int для подачи в качестве входных данных декодера.
target_weights: список пустых векторов с плавающей запятой для подачи в качестве целевых весов.
Bucket_id: какой сегмент модели использовать.
forward_only: делать шаг назад или только вперед.

Возвращает:
Тройка, состоящая из нормы градиента (или None, если мы не делали в обратном порядке),
средняя недоумение, и выходы.

Поднимает:
ValueError: если длина encoder_inputs, decoder_inputs или
target_weights не соответствует размеру сегмента для указанного Bucket_id.
"""

Проверьте, совпадают ли размеры.

encoder_size, decoder_size = self.buckets[bucket_id]
если len(encoder_inputs) != encoder_size:
поднять ValueError("Длина кодировщика должна быть равна длине в корзине,"
"%d != %d." % (len(encoder_inputs), encoder_size))
если len(decoder_inputs) != decoder_size:
поднять ValueError("Длина декодера должна быть равна длине в корзине,"
"%d != %d." % (len(decoder_inputs), decoder_size))
если len(target_weights) != decoder_size:
поднять ValueError("Длина гири должна быть равна длине в ведре,"
"%d != %d." % (длина (целевые_веса), декодер_размер))

Входной поток: входы кодировщика, входы декодера, target_weights, как указано.

input_feed = {}
для l в xrange (encoder_size):
input_feed[self.encoder_inputs[l].name] = encoder_inputs[l]
для l в xrange (decoder_size):
input_feed[self.decoder_inputs[l].name] = decoder_inputs[l]
input_feed[self.target_weights[l].name] = target_weights[l]

Поскольку наши цели — входные данные декодера, сдвинутые на единицу, нам нужен еще один.

last_target = self.decoder_inputs[decoder_size].name
input_feed[last_target] = np.zeros([self.batch_size], dtype=np.int32)

Выходная подача: зависит от того, делаем ли мы шаг назад или нет.

если не только вперед:
output_feed = [self.updates[bucket_id], # Обновление операции, выполняющей SGD.
self.gradient_norms[bucket_id], # Норма градиента.
self.losses[bucket_id]] # Убыток для этой партии.
еще:
output_feed = [self.losses[bucket_id]] # Убыток для этой партии.
for l in xrange(decoder_size): # Выходные логиты.
output_feed.append(self.outputs[bucket_id][l])

выходы = session.run(output_feed, input_feed)
если не только вперед:
return outputs[1], outputs[2], None # Градиент норма, потери, нет выходов.
еще:
return None, outputs[0], outputs[1:] # Без нормы градиента, потерь, выходов.

def get_batch (я, данные, Bucket_id):
"""Получите случайный пакет данных из указанного сегмента, подготовьтесь к шагу.

Чтобы передать данные на этапе (..), это должен быть список основных векторов пакета, в то время как
данные здесь содержат единичные основные случаи длины. Итак, основная логика этого
Функция состоит в том, чтобы переиндексировать случаи данных, чтобы они были в правильном формате для подачи.

Аргументы:
data: кортеж размером len(self.buckets), в котором каждый элемент содержит
списки пар входных и выходных данных, которые мы используем для создания пакета.
Bucket_id: целое число, для которого нужно получить партию.

Возвращает:
Тройка (encoder_inputs, decoder_inputs, target_weights) для
созданный пакет, который имеет правильный формат для вызова step(...) позже.
"""
encoder_size, decoder_size = self.buckets[bucket_id]
encoder_inputs, decoder_inputs = [], []

Получите случайный пакет входных данных кодировщика и декодера из данных,

дополните их, если необходимо, переверните входы энкодера и добавьте GO к декодеру.

для _ в xrange (self.batch_size):
encoder_input, decoder_input = random.choice(data[bucket_id])

# Входы энкодера дополняются, а затем реверсируются.
encoder_pad = [data_utils.PAD_ID] * (encoder_size - len(encoder_input))
encoder_inputs.append (список (обратный (encoder_input + encoder_pad)))

# Входные данные декодера получают дополнительный символ "GO" и затем дополняются.
decoder_pad_size = decoder_size - len(decoder_input) - 1
decoder_inputs.append([data_utils.GO_ID] + decoder_input +
[data_utils.PAD_ID] * decoder_pad_size)

Теперь мы создаем пакетные основные векторы из данных, выбранных выше.

batch_encoder_inputs, batch_decoder_inputs, batch_weights = [], [], []

Входные данные пакетного кодировщика просто переиндексированы encoder_inputs.

для length_idx в xrange (encoder_size):
batch_encoder_inputs.append(
np.array([encoder_inputs[batch_idx][length_idx]
для batch_idx в xrange(self.batch_size)], dtype=np.int32))

Входные данные пакетного декодера переиндексируются decoder_inputs, мы создаем веса.

для length_idx в xrange (decoder_size):
batch_decoder_inputs.append(
np.array([decoder_inputs[batch_idx][length_idx]
для batch_idx в xrange(self.batch_size)], dtype=np.int32))

# Создайте target_weights равным 0 для целей, которые заполняются.
batch_weight = np.ones (self.batch_size, dtype = np.float32)
для batch_idx в xrange(self.batch_size):
# Мы устанавливаем вес равным 0, если соответствующая цель является PAD-символом.
# Соответствующая цель decoder_input сдвинута на 1 вперед.
если length_idx < decoder_size - 1:
target = decoder_inputs[batch_idx][length_idx + 1]
если length_idx == decoder_size - 1 или target == data_utils.PAD_ID:
вес_пакета[idx_пакета] = 0,0
batch_weights.append(batch_weight)
вернуть batch_encoder_inputs, batch_decoder_inputs, batch_weights`


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/tensorflow/tensorflow/issues/8191#issuecomment-312679587 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/ABtim0l5UMHHtbL1sz7meXserV8NVS7cks5sKQzXgaJpZM4MWl4f
.

Хорошо! Спасибо хоть! :)

@ebrevdo есть какие-нибудь новости о том, когда выйдет новый учебник по seq2seq с использованием нового API?
Спасибо. Потрясающая работа!.

да, жду нового туториала... было бы здорово узнать, планируется ли его выпуск в ближайшее время.. @ebrevdo

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

Мы надеемся на предстоящую неделю!

3 июля 2017 г., 10:16, «прашанцерай» [email protected] написал:

да, жду новый учебник... было бы здорово узнать, если это
планируется выпустить в ближайшее время.. @ebrevdo
https://github.com/ebrevdo

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


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/tensorflow/tensorflow/issues/8191#issuecomment-312697274 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/ABtim45-HTuQrIRDhphqqHjqkKOKTe53ks5sKSHYgaJpZM4MWl4f
.

Привет, ребята,

Любое обновление этой проблемы, я испытываю то же самое на tensorflow 1.1-gpu для mac os x

@tshi1983
У меня такая же проблема с tensorflow 1.1-gpu для Ubuntu.
Я обновляюсь до tf 1.2. Это все еще не работает.
Затем я меняю функцию embedding_attention_seq2seq в файле
тензорный поток/вклад/legacy_seq2seq/python/ops/seq2seq.py
к тому, что предложил @fabiofumarola выше.
Теперь начинается обучение. Я еще не тестировал декодирование.

Переместите код определения ячейки в seq2seq_f:

def seq2seq_f(encoder_inputs, decoder_inputs, do_decode):
      def single_cell():
        return tf.contrib.rnn.GRUCell(size)
      if use_lstm:
        def single_cell():
          return tf.contrib.rnn.BasicLSTMCell(size)
      cell = single_cell()
      if num_layers > 1:
        cell = tf.contrib.rnn.MultiRNNCell([single_cell() for _ in range(num_layers)])
      return tf.contrib.legacy_seq2seq.embedding_attention_seq2seq(
      ...
      )

Тогда «python translate.py --data_dir data/ --train_dir checkpoint/ --size=256 --num_layers=2 --steps_per_checkpoint=50" может работать.

@huxuanlai это работает! По крайней мере, сейчас это тренировка, спасибо!

@huxuanlai у меня тоже работает.

Я получаю те же AttributeError: 'NoneType' object has no attribute 'update' , но с tf.contrib.legacy_seq2seq.model_with_buckets . Я использую tf 1.2.1 (GPU) на Ubuntu 16.04 lts.

Кажется, это происходит только тогда, когда у меня более 1 ведра.

полная трассировка:

Traceback (most recent call last):
  File "chatbot.py", line 262, in <module>
    main()
  File "chatbot.py", line 257, in main
    train()
  File "chatbot.py", line 138, in train
    model.build_graph()
  File "/home/jkarimi91/Projects/cs20/code/hw/a3/model.py", line 134, in build_graph
    self._create_loss()
  File "/home/jkarimi91/Projects/cs20/code/hw/a3/model.py", line 102, in _create_loss
    softmax_loss_function=self.softmax_loss_function)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/site-packages/tensorflow/contrib/legacy_seq2seq/python/ops/seq2seq.py", line 1206, in model_with_buckets
    decoder_inputs[:bucket[1]])
  File "/home/jkarimi91/Projects/cs20/code/hw/a3/model.py", line 101, in <lambda>
    lambda x, y: _seq2seq_f(x, y, False),
  File "/home/jkarimi91/Projects/cs20/code/hw/a3/model.py", line 76, in _seq2seq_f
    feed_previous=do_decode)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/site-packages/tensorflow/contrib/legacy_seq2seq/python/ops/seq2seq.py", line 848, in embedding_attention_seq2seq
    encoder_cell = copy.deepcopy(cell)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 174, in deepcopy
    y = copier(memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/site-packages/tensorflow/python/layers/base.py", line 476, in __deepcopy__
    setattr(result, k, copy.deepcopy(v, memo))
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 163, in deepcopy
    y = copier(x, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 230, in _deepcopy_list
    y.append(deepcopy(a, memo))
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 190, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 334, in _reconstruct
    state = deepcopy(state, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 163, in deepcopy
    y = copier(x, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 257, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 190, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 334, in _reconstruct
    state = deepcopy(state, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 163, in deepcopy
    y = copier(x, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 257, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 190, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 334, in _reconstruct
    state = deepcopy(state, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 163, in deepcopy
    y = copier(x, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 257, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 190, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 334, in _reconstruct
    state = deepcopy(state, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 163, in deepcopy
    y = copier(x, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 257, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 163, in deepcopy
    y = copier(x, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 257, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 163, in deepcopy
    y = copier(x, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 230, in _deepcopy_list
    y.append(deepcopy(a, memo))
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 190, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 334, in _reconstruct
    state = deepcopy(state, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 163, in deepcopy
    y = copier(x, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 257, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 190, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 334, in _reconstruct
    state = deepcopy(state, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 163, in deepcopy
    y = copier(x, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 257, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 190, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 334, in _reconstruct
    state = deepcopy(state, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 163, in deepcopy
    y = copier(x, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 257, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 163, in deepcopy
    y = copier(x, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 230, in _deepcopy_list
    y.append(deepcopy(a, memo))
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 163, in deepcopy
    y = copier(x, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 237, in _deepcopy_tuple
    y.append(deepcopy(a, memo))
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 163, in deepcopy
    y = copier(x, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 257, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 190, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 334, in _reconstruct
    state = deepcopy(state, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 163, in deepcopy
    y = copier(x, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 257, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 190, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/home/jkarimi91/Apps/anaconda2/envs/tf/lib/python2.7/copy.py", line 343, in _reconstruct
    y.__dict__.update(state)
AttributeError: 'NoneType' object has no attribute 'update'

@Tshzzz @jtubert
спасибо, ваше решение сработало для меня. Моя версия tf 1.1.0.

Я изменился с:

    lstm_cell = tf.contrib.rnn.BasicLSTMCell(HIDDEN_SIZE, state_is_tuple=True)
    cell = tf.contrib.rnn.MultiRNNCell([lstm_cell() for _ in range(NUM_LAYERS)])
    output, _ = tf.nn.dynamic_rnn(cell, X, dtype=tf.float32)  

к:

    cells=[]
    for _ in range(NUM_LAYERS):
        cell = tf.contrib.rnn.BasicLSTMCell(HIDDEN_SIZE, state_is_tuple=True)
        cells.append(cell)
    multicell = tf.contrib.rnn.MultiRNNCell(cells, state_is_tuple=True)
    output, _ = tf.nn.dynamic_rnn(multicell, X, dtype=tf.float32)

Это все еще не исправлено, перепробовал все возможные решения, упомянутые в этом потоке и stackoverflow, он не работает с тензорным потоком 1.3, 1.2 или 1.1.

Я сталкиваюсь с этой ошибкой:
TypeError: embedding_attention_seq2seq() missing 1 required positional argument: 'dec_cell'

Ошибка указывает на эту функцию в seq2seq_model.py, которая является строкой 142 в seq2seq_model.py:

def seq2seq_f(encoder_inputs, decoder_inputs, do_decode): return tf.contrib.legacy_seq2seq.embedding_attention_seq2seq( encoder_inputs, decoder_inputs, cell, num_encoder_symbols=source_vocab_size, num_decoder_symbols=target_vocab_size, embedding_size=size, output_projection=output_projection, feed_previous=do_decode, dtype=dtype)

Все, кто столкнулся с этой ошибкой и сумел решить эту проблему, пожалуйста, помогите мне исправить эту проблему.

ValueError: попытка повторного использования RNNCellс другой областью действия переменных, чем его первое использование. Первое использование ячейки было с областью действия «rnn/multi_rnn_cell/cell_0/gru_cell», эта попытка — с областью действия «rnn/multi_rnn_cell/cell_1/gru_cell». Пожалуйста, создайте новый экземпляр ячейки, если вы хотите использовать другой набор весов. Если раньше вы использовали: MultiRNNCell([GRUCell(...)] * num_layers), измените на: MultiRNNCell([GRUCell(...) for _ in range(num_layers)]). Если раньше вы использовали один и тот же экземпляр ячейки в качестве прямой и обратной ячейки двунаправленной RNN, просто создайте два экземпляра (один для прямого, один для обратного). В мае 2017 года мы начнем изменять поведение этой ячейки для использования существующих сохраненных весов, если таковые имеются, когда она вызывается с параметром scope=None (что может привести к скрытой деградации модели, поэтому эта ошибка останется до тех пор).

исходный код:
из tensorflow.contrib импорт rnn
входы = tf.placeholder(dtype=tf.int32, shape=[None, None], name="inputs")
keep_prob = tf.placeholder (dtype = tf.float32, name = «keep_prob»)
ячейка = rnn.GRUCell(10)
ячейка = rnn.DropoutWrapper (ячейка = ячейка, input_keep_prob = keep_prob)
ячейка = rnn.MultiRNNCell([ячейка для _ в диапазоне (5)], state_is_tuple=True)

выходы, состояния = tf.nn.dynamic_rnn (ячейка = ячейка, входы = look_up, dtype = tf.float32)
решение:
входы = tf.placeholder(dtype=tf.int32, shape=[None, None], name="inputs")
keep_prob = tf.placeholder (dtype = tf.float32, name = «keep_prob»)
ячейка = rnn.MultiRNNCell([rnn.DropoutWrapper(rnn.GRUCell(10), input_keep_prob=keep_prob) for _ in range(5)] , state_is_tuple=True)

У вас есть эта проблема с tf nightlies?

1 октября 2017 г., 8:34, «Баохуа Чжоу» [email protected] написал:

У меня такая же проблема при использовании tensorflow 1.1 на процессоре с ios.


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/tensorflow/tensorflow/issues/8191#issuecomment-333384725 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/ABtimwOv7vf5vvFXBllbZryjCFwmJcU6ks5sn7DxgaJpZM4MWl4f
.

AttributeError: объект «NoneType» не имеет атрибута «обновление»

в тс=1,3

ValueError: попытка повторного использования RNNCellс другой областью действия переменных, чем его первое использование. Первое использование ячейки было с областью действия «embedding_attention_seq2seq/rnn/multi_rnn_cell/cell_0/gru_cell», эта попытка — с областью действия «embedding_attention_seq2seq/rnn/multi_rnn_cell/cell_1/gru_cell». Пожалуйста, создайте новый экземпляр ячейки, если вы хотите использовать другой набор весов. Если раньше вы использовали: MultiRNNCell([GRUCell(...)] * num_layers), измените на: MultiRNNCell([GRUCell(...) for _ in range(num_layers)]). Если раньше вы использовали один и тот же экземпляр ячейки в качестве прямой и обратной ячейки двунаправленной RNN, просто создайте два экземпляра (один для прямого, один для обратного). В мае 2017 года мы начнем изменять поведение этой ячейки для использования существующих сохраненных весов, если таковые имеются, когда она вызывается с параметром scope=None (что может привести к скрытой деградации модели, поэтому эта ошибка останется до тех пор).

Прошло 14 дней без активности, и был присвоен ярлык awaiting tensorflower . Пожалуйста, обновите метку и/или статус соответствующим образом.

Нытье в ожидании TensorFlower: прошло 14 дней без активности, и была присвоена метка awaiting tensorflower . Пожалуйста, обновите метку и/или статус соответствующим образом.

Решение состоит в том, чтобы перейти на более новую версию TF. Эта ветка резко отличается от своей первоначальной проблемы. Закрытие.

Если вам нужно мгновенное решение, вы можете попробовать то, что я пробовал:

pip install tensorflow==1.0
Проблема связана с версией tenorflow 1.1, у меня это сработало.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги