LoginSignup
2
2

More than 3 years have passed since last update.

【Hyperas】TypeError: 'function' object is not subscriptableの解決

Posted at

はじめに

私自身が困ったエラーだったので誰かの助けになればと思います。

TypeError: 'function' object is not subscriptable

このエラーは関数部に問題があると考えられます。


この問題を修正するためには、hyperasモジュールで追加した部分を見返しましょう。

環境

  • MacOS
  • Jupyter Notebook
  • Python 3.7
  • Keras Function API

モジュールのインポート

from tensorflow.keras import layers
from tensorflow.keras import Input
from hyperas.distributions import choice
from hyperas.distributions import uniform

Before

def create_model(X_train, y_train, X_test, y_test):
    input_tensor = Input(shape=(X_train.shape[1],))
    x = layers.Dense({{choice[128, 256, 512]}}, activation="relu", kernel_regularizer = regularizers.l2({{choice[0.01, 0.001, 0.0001]}}))(input_tensor)
    x = layers.Dropout({{uniform(0, 1)}})(x)
        :

これのどこが問題かお分かりでしょうか。


では次にコードを修正したAfterを表示します。

After

def create_model(X_train, y_train, X_test, y_test):
    input_tensor = Input(shape=(X_train.shape[1],))
    x = layers.Dense({{choice([128, 256, 512])}}, activation="relu", kernel_regularizer = regularizers.l2({{choice([0.01, 0.001, 0.0001])}}))(input_tensor)
    x = layers.Dropout({{uniform(0, 1)}})(x)
        :

{{}}のchoiceの扱い方に注目してください。

{{choice[128, 256, 512]}}
{{choice([128, 256, 512])}}

このようにchoiceに( )をつけていないと、先程のエラーがでてしまいました。


このエラーは、

TypeError                                 Traceback (most recent call last)
<ipython-input-55-c060629fd2f2> in <module>
      7         max_evals=5,
      8         trials=trials,
----> 9         notebook_name="sample_notebook"
     10 )
     11 

このようにメイン関数内[optim.minimize( )]でエラーを指摘されるので、どこに不具合があるのか特定しづらいです。

非常に単純なミスから招いたエラーですが、エラーコードを読んでもどこが間違っているのかわかりませんでした。

もし私と同じようなエラーが出た場合はまず、関数の表記が間違っていないか確認してみると良いと思います。

参考サイト

【GitHub】TypeError: 'function' object is not subscriptable

Keras での書き方

下記のソースコードは、先程のAfterのソースコードと同じです。


(モデルに変換する部分は表示していないので厳密には同じとは言えませんが、モデルの構成としては同じなのでご了承お願いします。)

from tensorflow.keras import models
from tensorflow.keras import layers
from tensorflow.keras import regularizers

def create_model(X_train, y_train, X_test, y_test):
    model = Sequential()
    model.add(layers.Dense({{choice([128, 256, 512])}}, activation="relu", kernel_regularizer = regularizers.l2({{choice([0.01, 0.001, 0.0001])}}), input_shape=(X_train.shape[1],))
    model.add(layers.Dropout({{uniform(0, 1)}})
           :
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2