1. ホーム
  2. python

[解決済み] ValueErrorです。TensorはTensorflowのBidirectinal RNNを持つTensorと同じグラフからでなければならない

2022-02-12 06:09:46

質問

Bidirectional dynamic RNNをtensorflowで使って、テキストタガーを作っています。 入力の次元を決定した後、Sessionを実行しようとした。 こちらはblstmの設定部分です。

fw_lstm_cell = BasicLSTMCell(LSTM_DIMS)
bw_lstm_cell = BasicLSTMCell(LSTM_DIMS)

(fw_outputs, bw_outputs), _ = bidirectional_dynamic_rnn(fw_lstm_cell,
                                                        bw_lstm_cell,
                                                        x_place,
                                                        sequence_length=SEQLEN,
                                                        dtype='float32')

そして、これが実行部分です。

  with tf.Graph().as_default():
    # Placehoder Settings
    x_place, y_place = set_placeholder(BATCH_SIZE, EM_DIMS, MAXLEN)

    # BLSTM Model Building
    hlogits = tf_kcpt.build_blstm(x_place)

    # Compute loss
    loss = tf_kcpt.get_loss(log_likelihood)

    # Training
    train_op = tf_kcpt.training(loss)

    # load Eval method
    eval_correct = tf_kcpt.evaluation(logits, y_place)

    # Session Setting & Init
    init = tf.global_variables_initializer()
    sess = tf.Session()
    sess.run(init)

    # tensor summary setting
    summary = tf.summary.merge_all()
    summary_writer = tf.summary.FileWriter(LOG_DIR, sess.graph)

    # Save
    saver = tf.train.Saver()

    # Run epoch
    for step in range(EPOCH):
        start_time = time.time()

        feed_dict = fill_feed_dict(KCPT_SET['train'], x_place, y_place)
        _, loss_value = sess.run([train_op, loss], feed_dict=feed_dict)

しかし、それは私にエラーを与える。

ValueError: Tensor("Shape:0", shape=(1,), dtype=int32) は Tensor("bidirectional_rnn/fw/fw/stack_2:0", shape=(1,), dtype=int32) と同じグラフからでなければなりません。

助けてください

どのように解決するのですか?

TensorFlowは、すべての操作をオペレーショナルグラフに格納します。このグラフは、どの関数がどこに出力するかを定義し、グラフで設定したステップに従って最終的な出力が得られるように、すべてをリンクしている。もしあるグラフ上のTensorや演算を、別のグラフ上のTensorや演算に入力しようとすると失敗する。全ては同じ実行グラフ上でなければならない。

を削除してみてください。 with tf.Graph().as_default():

TensorFlowでは、グラフを指定しない場合、デフォルトのグラフが参照されます。おそらく、ある場所ではデフォルトのグラフを使い、学習ブロックでは別のグラフを使っているのではないでしょうか。

ここでデフォルトのグラフを指定している理由はなさそうで、たまたま別々のグラフを使用している可能性が高いです。本当にグラフを指定したいのであれば、このように設定するのではなく、変数として渡すべきでしょう。