質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.99%

'Model' object has no attribute '_output_tensor_cache'が直らない

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,092

yep

score 43

やりたいこと

kerasのexample、https://github.com/keras-team/keras/blob/master/examples/lstm_seq2seq.py(オリジナル)を基に
一つの情報から複数の情報をseq2seqで推定したい(アレンジ)と考えています。

起きている問題

Python 3.6.4 :: Anaconda, Inc.
keras                     2.2.4
tensorflow                1.12.0          gpu_py36he74679b_0
numpy                     1.15.4

Using TensorFlow backend.
Max sequence length for input_image: 2099200
Max sequence length for integer: 2099200
Max sequence length for exponent: 2099200
Traceback (most recent call last):
  File "./Desktop/seq2seq_hdf.py", line 130, in <module>
    validation_split=0.2)
  File "/home/yudai/.local/lib/python3.6/site-packages/keras/engine/training.py", line 952, in fit
    batch_size=batch_size)
  File "/home/yudai/.local/lib/python3.6/site-packages/keras/engine/training.py", line 677, in _standardize_user_data
    self._set_inputs(x)
  File "/home/yudai/.local/lib/python3.6/site-packages/keras/engine/training.py", line 636, in _set_inputs
    outputs = self.call(unpack_singleton(self.inputs))
  File "/home/yudai/.local/lib/python3.6/site-packages/keras/engine/network.py", line 561, in call
    if cache_key in self._output_tensor_cache:
AttributeError: 'Model' object has no attribute '_output_tensor_cache'

試したこと

'_output_tensor_cache'のエラーについて調べてみたところ、
https://stackoverflow.com/questions/49881096/how-to-fix-error-object-has-no-attribute-output-tensor-cache
https://github.com/keras-team/keras/issues/9310
上記の同じエラーのサイトを見つけました。
AttributeErrorは、属性名、メソッド名が違うことによって起きるエラーで、
今回の場合は、keras、tensorflowのダウングレードを行うと解決できるのではと考えていましたが、別のエラーを引き起こしました。

python 3.5
keras:2.1.2
tensorflow:1.1.0_np112py35_0
numpy:1.12.1

Using TensorFlow backend.
Max sequence length for input_image: 2099200
Max sequence length for integer: 2099200
Max sequence length for exponent: 2099200
Traceback (most recent call last):
  File "/home/yudai/Desktop/seq2seq.py", line 122, in <module>
    decoder_integer_output, decoder_exponent_output, decoder_sign_output)
  File "/home/yudai/.pyenv/versions/anaconda3-5.3.1/envs/gpu/lib/python3.5/site-packages/keras/legacy/interfaces.py", line 87, in wrapper
    return func(*args, **kwargs)
TypeError: __init__() takes from 2 to 3 positional arguments but 4 were given


kerasやtensorflowのModelについても調べましたが、どう直せば良いのか分かりませんでした。
kerasのModel(functional API)
https://keras.io/ja/models/model/
tensorflowのModel
https://www.tensorflow.org/api_docs/python/tf/keras/models/Model

アレンジ

from keras.layers import Input, LSTM, Dense, Concatenate
from keras.models import Model
import numpy as np

batch_size = 64
epochs = 100
latent_dim = 256

input_image = [None] * 2
for i in range(2):
    with open('./Desktop//speedy/input/{}.txt'.format(i + 1), mode='r', encoding='utf-8')as f:
        input_image[i] = f.read()
target_integer = [None] * 2
for i in range(2):
    with open('./Desktop/speedy/target_integer/{}.txt'.format(i + 1), mode='r', encoding='utf-8')as f:
        target_integer[i] = f.read()
target_exponent = [None] * 2
for i in range(2):
    with open('./Desktop/speedy/target_exponent/{}.txt'.format(i + 1), mode='r', encoding='utf-8')as f:
        target_exponent[i] = f.read()
input_characters = [None] * 2
for i in range(2):
    with open('./Desktop/speedy/input/{}.txt'.format(i + 1), mode='r', encoding='utf-8')as f:
        input_characters[i] = f.read()
target_integer_characters = [None] * 2
for i in range(2):
    with open('./Desktop/speedy/target_integer/{}.txt'.format(i + 1), mode='r', encoding='utf-8')as f:
        target_integer_characters[i] = f.read()
target_exponent_characters = [None] * 2
for i in range(2):
    with open('./Desktop/speedy/target_exponent/{}.txt'.format(i + 1), mode='r', encoding='utf-8')as f:
        target_exponent_characters[i] = f.read()

input_images = map(str, input_image)
target_integers = map(str, target_integer)
target_exponents = map(str, target_exponent)
input_characters = set(input_characters)
target_integer_characters = set(target_integer_characters)
target_exponent_characters = set(target_exponent_characters)

for char in input_images:
    if char not in input_characters:
        input_characters.add(char)
for char in target_integers:
    if char not in target_integer_characters:
        target_integer_characters.add(char)
for char in target_exponents:
    if char not in target_exponent_characters:
        target_exponent_characters.add(char)

input_char = sorted(list(input_characters))
target_integer_char = sorted(list(target_integer_characters))
target_exponent_char = sorted(list(target_exponent_characters))
num_encoder_tokens = len(input_char)
num_decoder_integer_tokens = len(target_integer_char)
num_decoder_exponent_tokens = len(target_exponent_char)
max_encoder_seq_length = max([len(number) for number in input_image])
max_decoder_integer_seq_length = max([len(integer) for integer in target_integer])
max_decoder_exponent_seq_length = max([len(exponent) for exponent in target_exponent])

input_token_index = dict(
    [(char, i) for i, char in enumerate(input_char)])
target_integer_token_index = dict(
    [(char, i) for i, char in enumerate(target_integer_char)])
target_exponent_token_index = dict(
    [(char, i) for i, char in enumerate(target_exponent_char)])

encoder_input_data = np.zeros(
    (len(input_image), max_encoder_seq_length, num_encoder_tokens),
    dtype='float32')
decoder_integer_input_data = np.zeros(
    (len(input_image), max_decoder_integer_seq_length, num_decoder_integer_tokens),
    dtype='float32')
decoder_exponent_input_data = np.zeros(
    (len(input_image), max_decoder_exponent_seq_length, num_decoder_exponent_tokens),
    dtype='float32')
decoder_integer_target_data = np.zeros(
    (len(input_image), max_decoder_integer_seq_length, num_decoder_integer_tokens),
    dtype='float32')
decoder_exponent_target_data = np.zeros(
    (len(input_image), max_decoder_exponent_seq_length, num_decoder_exponent_tokens),
    dtype='float32')

for i, (input_images, target_integers, target_exponents) in enumerate(zip(input_image, target_integer, target_exponent)):
    for t, char in enumerate(input_images):
        encoder_input_data[i, t, input_token_index[char]] = 1.
    for t, char in enumerate(taregt_integers):
        decoder_input_data[i, t, target_integer_token_index[char]] = 1.
    for t, char in enumerate(taregt_exponents):
        decoder_input_data[i, t, target_exponent_token_index[char]] = 1.
        if t > 0:
            decoder_integer_target_data[i, t -1, target_integer_token_index[char]] = 1.
            decoder_exponent_target_data[i, t -1, target_integer_token_index[char]] = 1.

encoder_inputs = Input(shape=(None, num_encoder_tokens))
integer_input = Input(shape=(None, num_encoder_integer_tokens))
exponent_input = Input(shape=(None, num_encoder_exponent_tokens))

main_input = keras.layers.concatenate([integer_input, exponent_input)
encoder_inputs = keras.layers.concatenate([main_input, encoder_inputs])
encoder = LSTM(latent_dim, return_state=True)
encoder_outputs, state_h, state_c = encoder(encoder_inputs)
encoder_states = [state_h, state_c]

decoder_integer_input = Input(shape=(None, num_decoder_integer_tokens))
decoder_exponent_input = Input(shape=(None, num_decoder_exponent_tokens))

decoder_inputs = keras.layers.concatenate([decoder_integer_input, decoder_exponent_input])
integer_decoder_lstm = LSTM(latent_dim, return_sequences=True, return_state=True)
exponent_decoder_lstm = LSTM(latent_dim, return_sequences=True, return_state=True)

integer_decoder_outputs, integer_, integer_ = decoder_lstm(integer_decoder_inputs, initial_state=encoder_states)
exponent_decoder_outputs, exponent_, exponent_ = decoder_lstm(exponent_decoder_inputs, initial_state=encoder_states)

integer_decoder_dense = Dense(num_decoder_integer_tokens, activation='softmax')
exponent_decoder_dense = Dense(num_decoder_exponent_tokens, activation='softmax')

decoder_integer_output = decoder_dense(decoder_dense[decoder_integer_output])
decoder_exponent_output = decoder_dense(decoder_dense[decoder_exponent_output])

model = Model(encoder_inputs=[encoder_inputs, decoder_inputs],
              decoder_outputs=[integer_outputs, exponent_outputs])

model.compile(optimizer='rmsprop', loss='categorical_crossentry')

model.fit([encoder_input_data, decoder_input_data],
          decoder_integer_target_data, decoder_exponent_target_data,
          batch_size=batch_size,
          epochs=epochs,
          validation_split=0.2)

model.save_weights('./Desktop/seq2eq_num.h5')
model.summary()
encoder_model = Model(encoder_inputs, encoder_states)

オリジナル

字数制限によりオリジナルのコードを載せれませんでした。
オリジナルにおけるアレンジの該当コード部分は、51から153行目までとなっています。


オリジナル
https://github.com/keras-team/keras/blob/master/examples/lstm_seq2seq.py

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる