Tensorflow: Mendapat kesalahan saat menginisialisasi rnn dua arah dengan sel LSTM

Dibuat pada 18 Jan 2016  ·  3Komentar  ·  Sumber: tensorflow/tensorflow

Saya ingin membangun model bi-rnn dengan tensorflow dengan sel LSTM, ketika saya mencoba menginisialisasi bidirectional_rnn,
itu memberi: ValueError: Over-sharing: Variable BiRNN_FW/RNN/BasicLSTMCell/Linear/Matrix already exists, disallowed. Did you mean to set reuse=True in VarScope?

import tensorflow as tf
from tensorflow.models.rnn import rnn, rnn_cell
from tensorflow.python.ops.constant_op import constant
import numpy as np

class Model(object):
    def __init__(self, batch_size, len_word, num_chars, dim_embed, dim_hidden):
        self.batch_size = batch_size
        self.dim_embed = dim_embed
        self.dim_hidden = dim_hidden
        self.num_chars = num_chars
        self.len_word = len_word

        with tf.device("/cpu:0"):
            self.embedding = tf.Variable(tf.random_uniform([num_chars, dim_embed], -0.1, 0.1), name='embedding')

        self.W_emb = tf.Variable(tf.random_uniform([dim_hidden*2, dim_embed], -0.1, 0.1), name='W_emb')
        self.b_emb = tf.Variable(tf.zeros([dim_embed]), name='b_emb')
        self.lstm_fw_cell = rnn_cell.BasicLSTMCell(dim_hidden)
        self.lstm_bw_cell = rnn_cell.BasicLSTMCell(dim_hidden)

    def build_model(self):
        inputs = tf.placeholder(tf.int32, [self.batch_size, self.len_word])
        input_length = tf.placeholder(tf.int64, [self.batch_size])
        lstm_state_fw = self.lstm_fw_cell.zero_state(self.batch_size, tf.float32)
        lstm_state_bw = self.lstm_bw_cell.zero_state(self.batch_size, tf.float32)

        with tf.device("/cpu:0"):
            embedded_input = tf.nn.embedding_lookup(self.embedding, tf.transpose(inputs))

        brnn_output = rnn.bidirectional_rnn(
            self.lstm_fw_cell, self.lstm_bw_cell,
            tf.unpack(embedded_input),
            sequence_length=input_length,
            initial_state_fw=lstm_state_fw,
            initial_state_bw=lstm_state_bw,
        )

        pooled_output = tf.reduce_sum( tf.pack(brnn_output), 0 )
        pooled_output = pooled_output / tf.expand_dims( tf.to_float(input_length) + 1e-6, 1)
        final_emb = tf.nn.xw_plus_b(pooled_output, self.W_emb, self.b_emb)
        final_emb = tf.nn.l2_normalize(final_emb, dim=1, epsilon=1e-7)

        return final_emb

Komentar yang paling membantu

Anda perlu menentukan cakupan variabel yang berbeda untuk sel LSTM.

with tf.variable_scope('forward'):
    self.lstm_fw_cell = rnn_cell.BasicLSTMCell(dim_hidden)   
with tf.variable_scope('backward'):
    self.lstm_bw_cell = rnn_cell.BasicLSTMCell(dim_hidden)

Kalau tidak, akan ada tabrakan nama (kedua sel mencoba menggunakan nama "BiRNN_FW/RNN/BasicLSTMCell/Linear/Matrix") dan tf akan menafsirkan ini seolah-olah niat Anda adalah untuk membagikan parameter di dua sel, yang bukan itu kamu ingin. TF akan mengeluarkan pengecualian karena Anda belum secara eksplisit memerintahkannya untuk menggunakan kembali variabel dalam lingkup kedua: with variable_scope(name, reuse=True) .

Menyetel cakupan variabel, seperti di atas, akan membuat nama unik untuk variabel:
BiRNN_FW/RNN/BasicLSTMCell/ forward /Linear/Matrix
BiRNN_FW/RNN/BasicLSTMCell/ mundur /Linear/Matriks

Baca panduan Berbagi Variabel untuk informasi selengkapnya.

Semua 3 komentar

Anda perlu menentukan cakupan variabel yang berbeda untuk sel LSTM.

with tf.variable_scope('forward'):
    self.lstm_fw_cell = rnn_cell.BasicLSTMCell(dim_hidden)   
with tf.variable_scope('backward'):
    self.lstm_bw_cell = rnn_cell.BasicLSTMCell(dim_hidden)

Kalau tidak, akan ada tabrakan nama (kedua sel mencoba menggunakan nama "BiRNN_FW/RNN/BasicLSTMCell/Linear/Matrix") dan tf akan menafsirkan ini seolah-olah niat Anda adalah untuk membagikan parameter di dua sel, yang bukan itu kamu ingin. TF akan mengeluarkan pengecualian karena Anda belum secara eksplisit memerintahkannya untuk menggunakan kembali variabel dalam lingkup kedua: with variable_scope(name, reuse=True) .

Menyetel cakupan variabel, seperti di atas, akan membuat nama unik untuk variabel:
BiRNN_FW/RNN/BasicLSTMCell/ forward /Linear/Matrix
BiRNN_FW/RNN/BasicLSTMCell/ mundur /Linear/Matriks

Baca panduan Berbagi Variabel untuk informasi selengkapnya.

Perhatikan bahwa ini tidak akan terjadi lagi karena variabel dibuat di dalam ...Cell.__call__ dan bukan di ...Cell.__init__ , sehingga tidak memerlukan ruang lingkup untuk konstruksi sel, dan itu akan menangani ruang lingkup variabel sendiri di dalam bidirectional_rnn sehingga Anda tidak perlu melingkupinya sendiri.

Saya masih memiliki masalah yang sama. Ada saran? Saya telah mencoba pendekatan yang diusulkan oleh salomons, hasil yang sama. Tidak mengembalikan Tuple apa pun sebagai hasilnya.
((encoder_fw_outputs,
encoder_bw_outputs),
(encoder_fw_final_state,
encoder_bw_final_state)) = (
tf.nn.bidirectional_dynamic_rnn(cell_fw=encoder_cell,
sel_bw=sel penyandi_sel,
masukan=encoder_inputs_embedded,
sequence_length=panjang_pengenkode_input,
dtype=tf.float64, time_major=Benar)
)

ValueError Traceback (panggilan terakhir terakhir)
di dalam()
20 input=encoder_inputs_embedded,
21 sequence_length=encoder_inputs_length,
---> 22 dtype=tf.float32, time_major=Benar)
23 )
24

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc dalam bidirectional_dynamic_rnn(cell_fw, cell_bw, input, sequence_length, initial_state_fw, initial_state_bw, dtype, parallel_iterations , time_major, ruang lingkup)
348 initial_state=initial_state_fw, dtype=dtype,
349 parallel_iteration=parallel_iterations, swap_memory=swap_memory,
--> 350 time_major=time_major, scope=fw_scope)
351
352 # Arah mundur

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc di dynamic_rnn(cell, input, sequence_length, initial_state, dtype, parallel_iterations, swap_memory, time_major, scope )
544 swap_memory=swap_memory,
545 urutan_panjang=panjang_urutan,
-> 546 dtype=dtype)
547
548 # Output dari _dynamic_rnn_loop selalu berbentuk [time, batch, depth].

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc di _dynamic_rnn_loop(cell, input, initial_state, parallel_iterations, swap_memory, sequence_length, dtype)
711 loop_vars=(waktu, output_ta, status),
712 parallel_iteration=parallel_iteration,
-> 713 swap_memory=swap_memory)
714
715 # Buka kemasan keluaran akhir jika tidak menggunakan tupel keluaran.

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/control_flow_ops.pyc di while_loop(cond, body, loop_vars, shape_invariants, parallel_iterations, back_prop, swap_memory, nama)
2603 konteks = WhileContext(parallel_iterations, back_prop, swap_memory, nama)
2604 ops.add_to_collection(ops.GraphKeys.WHILE_CONTEXT, konteks)
-> 2605 hasil = konteks.BuildLoop(cond, body, loop_vars, shape_invariants)
2606 hasil kembali
2607

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/control_flow_ops.pyc di BuildLoop(self, pred, body, loop_vars, shape_invariants)
2436 sendiri.Masukkan()
2437 original_body_result, exit_vars = self._BuildLoop(
-> 2438 pred, body, original_loop_vars, loop_vars, shape_invariants)
2439 akhirnya:
2440 mandiri.Keluar()

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/control_flow_ops.pyc di _BuildLoop(self, pred, body, original_loop_vars, loop_vars, shape_invariants)
2386 struktur = original_loop_vars,
2387 flat_sequence=vars_for_body_with_tensor_arrays)
-> 2388 body_result = body(*packed_vars_for_body)
2389 jika bukan nest.is_sequence(body_result):
2390 body_result = [body_result]

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc di _time_step(waktu, output_ta_t, status)
694 sel_panggilan=sel_panggilan,
695 state_size=ukuran_status,
--> 696 skip_conditionals=Benar)
697 lainnya:
698 (keluaran, status_baru) = call_cell()

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc dalam _rnn_step(time, sequence_length, min_sequence_length, max_sequence_length, zero_output, state, call_cell, state_size, skip_conditionals )
175 # langkah. Ini lebih cepat ketika max_seq_len sama dengan jumlah pembukaan gulungan
176 # (yang khas untuk dynamic_rnn).
-> 177 new_output, new_state = call_cell()
178 nest.assert_same_structure(state, new_state)
179 status_baru = sarang.flatten(status_baru)

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc di()
682
683 input_t = nest.pack_sequence_as(structure=inputs, flat_sequence=input_t)
--> 684 call_cell = lambda: sel(input_t, status)
685
686 jika sequence_length bukan None:

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.pyc di __call__(self, input, state, scope)
336 # i = gerbang_masukan, j = masukan_baru, f = gerbang_lupa, o = gerbang_keluaran
337 lstm_matrix = _linear([input, m_prev], 4 * self._num_units, bias=Benar,
-> 338 ruang lingkup = ruang lingkup)
339 i, j, f, o = array_ops.split(
340 nilai=lstm_matrix, num_or_size_splits=4, axis=1)

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.pyc di _linear(args, output_size, bias, bias_start, scope)
745 dengan vs.variable_scope(scope) sebagai outer_scope:
746 bobot = vs.get_variable(
--> 747 "bobot", [total_arg_size, output_size], dtype=dtype)
748 jika len(args) == 1:
749 res = math_ops.matmul(args[0], bobot)

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.pyc di get_variable(name, shape, dtype, initializer, regularizer, trainable, collections, caching_device, partitioner , validasi_bentuk, pengambil_kustom)
986 koleksi=koleksi, caching_device=caching_device,
987 partisi = partisi, validasi_bentuk = validasi_bentuk,
-> 988 custom_getter=custom_getter)
989 get_variable_or_local_docstring = (
990 """%s

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.pyc di get_variable(self, var_store, name, shape, dtype, initializer, regularizer, trainable, collections , perangkat_caching, pempartisi, bentuk_validasi, pengambil_kustom)
888 koleksi=koleksi, caching_device=caching_device,
889 partisi = partisi, validasi_bentuk = validasi_bentuk,
-> 890 custom_getter=custom_getter)
891
892 def _get_partitioned_variable(sendiri,

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.pyc di get_variable(self, name, shape, dtype, initializer, regularizer, reuse, trainable, collections , perangkat_caching, pempartisi, bentuk_validasi, pengambil_kustom)
346 penggunaan kembali=penggunaan kembali, dapat dilatih=dapat dilatih, koleksi=koleksi,
347 caching_device=caching_device, partisi=partisi,
-> 348 validasi_bentuk=validasi_bentuk)
349
350 def _get_partitioned_variable(

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.pyc di _true_getter(nama, bentuk, dtype, penginisialisasi, regularizer, penggunaan kembali, dapat dilatih, koleksi, caching_device , pemartisi, validasi_bentuk)
331 initializer=initializer, regularizer=regularizer, reuse=reuse,
332 dapat dilatih=dapat dilatih, koleksi=koleksi,
--> 333 caching_device=caching_device,validasi_shape=validate_shape)
334
335 jika custom_getter bukan None:

/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.pyc di _get_single_variable(self, name, shape, dtype, initializer, regularizer, partition_info, reuse, trainable , koleksi, perangkat_caching, bentuk_validasi)
637 " Apakah maksud Anda menyetel reuse=True di VarScope? "
638 "Awalnya ditentukan di:\n\n%s" % (
--> 639 nama, "".join(traceback.format_list(tb))))
640 found_var = self._vars[nama]
641 jika bukan shape.is_compatible_with(found_var.get_shape()):

ValueError: Variabel bidirectional_rnn/fw/lstm_cell/weights sudah ada, tidak diizinkan. Apakah maksud Anda mengatur reuse=True di VarScope? Awalnya didefinisikan di:

File "/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py", baris 747, di _linear
"bobot", [total_arg_size, output_size], dtype=dtype)
File "/home/cesar/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py", baris 338, di __call__
ruang lingkup = ruang lingkup)
Berkas "", baris 24, di
time_major=Benar

Apakah halaman ini membantu?
0 / 5 - 0 peringkat