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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python

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

Q&A

解決済

2回答

429閲覧

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

yep

総合スコア45

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python

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

0グッド

0クリップ

投稿2019/02/11 18:21

#発生している問題

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
上記のコードをそのまま複数入力、出力で書いてみました。

python

1encoder_inputs = Input(shape=(None, num_encoder_tokens)) 2integer_input = Input(shape=(None, num_encoder_integer_tokens)) 3exponent_input = Input(shape=(None, num_encoder_exponent_tokens)) 4 5encoder_input = keras.layers.concatenate([encoder_inputs, integer_input, exponent_input]) 6encoder = LSTM(latent_dim, return_state=True)(encoder_input) 7encoder_outputs, state_h, state_c = encoder(encoder_input)

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

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

投稿2019/02/11 22:19

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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

python

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

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

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

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

python

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

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

python

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

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

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

python

1def foo(): 2 def bar(a): 3 return [a, a] 4 return bar 5 6foo() # => 結果は<function __main__.foo.<locals>.bar>なんて出てきます。要するに関数 7foo()(10) # => 結果は[10, 10]

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

投稿2019/02/12 04:40

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yep

2019/02/12 08:08 編集

初心者ですが、高階関数がかなり便利なものだと感じました。 今回の場合、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)
KSwordOfHaste

2019/02/12 12:03

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

2019/02/12 13:42

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問