はじめに
私自身が困ったエラーだったので誰かの助けになればと思います。
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)}})
: