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

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

ただいまの
回答率

90.36%

  • Python

    10326questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Keras

    385questions

listという変数名を使ってないのに、型エラーが起きる

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 152

yep

score 36

発生している問題

Traceback (most recent call last):
  File "/home/yudai/Desktop/seq2seq_hdf.py", line 140, in <module>
    self.encoder_outputs, self.state_h, self.state_c = encoder(encoder_input)
TypeError: 'list' object is not callable


https://github.com/keras-team/keras/blob/master/examples/lstm_seq2seq.py
上記のコードをそのまま複数入力、出力で書いてみました。

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))

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

確認したこと

Pythonでlistをlistという変数名で定義してしまった
上記サイトより、組み込み関数と同じ名前の変数名を定義するとエラーが発生するとあるのですが、
このプログラムでは、変数名に'list'とは使っていません。
複数の場合、単一の入力、出力とは、違う特殊な書き方があるのでしょうか

何卒、ご教授宜しくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+3

y_waiwaiさん回答と同じことを少し詳しく言っただけのコメントですが・・・

おそらく質問者さんは「関数呼び出し」と「関数そのもの」の違いが曖昧なのではないでしょうか?エラーメッセージのいわんとしていることは

an_list = [1, 2, 3]
an_list(引数)

のように「listのインスタンスに対して、それがあたかも関数であるかのように引数を指定して呼び出そうとしてしてますよ」です。listという名前の変数を定義したかどうかが問題ではないのです。

元のコードで変数encoderにはLSTM(...)という関数呼び出しの結果が入ってますがそれがcallable(※)だったはずです。

一方質問者さんのコードは以下ですが、

encoder = LSTM(latent_dim, return_state=True)(encoder_input)  # (A)
encoder_outputs, state_h, state_c = encoder(encoder_input)    # (B)


(A)でLSTM(...)の結果に対してさらに引数を指定して関数呼び出しをしてます。その結果をencoderに代入してますので元のコードでのencoderと全く意味が違ってきます。元のコードと同様に次のようにすべきでしょう。

encoder = LSTM(latent_dim, return_state=True)
encoder_outputs, state_h, state_c = encoder(encoder_input)

※callable:
上の説明では関数とかcallableとかいった単語をごちゃまぜに使ってますが、Pythonの用語callableは引数を伴い呼び出すことができるオブジェクトのことで、def f(...): ...で定義した関数fとかclass C: ...で定義されたクラスCといった類があります。LSTM関数はcallableを返すcallableだったのです。

callableの代わりにあえて関数という用語を使いますが、関数fが別の関数を引数にとったり結果として返したりするとき、fのことを高階関数といったりします。プログラミングを始めたばかりのころは「関数」と「関数呼び出し」の違いや高階関数というものに少し混乱するかも知れません。もしそうならご自分で少し実験してみることをお勧めします。

def foo():
    def bar(a):
        return [a, a]
    return bar

foo()       # => 結果は<function __main__.foo.<locals>.bar>なんて出てきます。要するに関数
foo()(10)   # => 結果は[10, 10]


LSTMは上の例のfooのようなものであったと捉えるとよいでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/12 17:03 編集

    初心者ですが、高階関数がかなり便利なものだと感じました。
    今回の場合、LSTM()自体がcallableであるため、encoder_inputを引数として渡す必要はなかったと理解しました。
    お手を煩わせてしまい申し訳ないのですが、
    NameError: name 'integer_decoder_lstm' is not definedが出てしまいます。
    encoder_input = keras.layers.concatenate([encoder_inputs, integer_input, exponent_input])
    encoder = LSTM(latent_dim, return_state=True)(encoder_input)
    encoder_outputs, state_h, state_c = encoder
    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])
    decoder_lstm = LSTM(latent_dim, return_sequences=True, return_state=True)(decoder_inputs)
    #この部分でNameErrorが出ます。
    decoder_output, integer_, integer_ = integer_decoder_lstm(decoder_integer_input, initial_state=encoder_states)

    キャンセル

  • 2019/02/12 21:03

    pythonの世界ではあらゆるものがなんらかの変数に入っておりその変数名を書くと値が参照できるという仕組みになってます。というか大抵の言語がそうです。変数はどこかで代入しないと値が入りません。というより代入すると初めてある名前が変数として値を持つようになります。そういう代入をしないとその名前にはなんの値も結び付いていません。pythonを起動したばかりで
    print(a)
    とやるとNameError: name 'a' is not defined
    と出ます。上記エラーはそれと同じです。integer_decoder_lstmという名前に値を代入する個所がどこにもないのです。

    キャンセル

  • 2019/02/12 22:42

    まさにご指摘の通りでした。
    この場合、
    decoder_lstmだけしか変数がなかったことによるエラーでした。
    ありがとうございました。

    キャンセル

+3

エラーメッセージを読みましょうよ

google翻訳
TypeError: 'list'オブジェクトは呼び出し不可能です

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

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

同じタグがついた質問を見る

  • Python

    10326questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Keras

    385questions