0

Kerasチューナーを使用しています。次の単純なコードの場合:

import keras_tuner as kt
from tensorflow.keras.regularizers import l1, l2
from tensorflow.keras.models import Sequential

# x: 100 x 20
# y: 1 x 100

tuner = kt.Hyperband(
            self.build_auto_encoder_model,
            objective='val_loss',
            max_epochs=30,
            hyperband_iterations=20)

tuner.search(x[0:80], y[0:80], epochs=30, validation_data=(x[80:], y[80:]))
best_model = tuner.get_best_models(1)[0]

def build_auto_encoder_model(hp):
    model = Sequential()
    regulizer_rate = hp.Choice("regulizer_rate", [1e-1, 1e-2, 1e-3, 1e-4, 1e-5])

    model.add(Dense(18, input_dim=20, activation='relu', kernel_regularizer=l1(regulizer_rate)))
    model.add(Dense(12, activation='relu', kernel_regularizer=l1(regulizer_rate)))
    model.add(Dense(10, activation='relu', kernel_regularizer=l1(regulizer_rate)))

    model.compile(optimizer=Adam(1e-2), loss='mse')

別の数のDenseレイヤーを既に試しましたが、次のエラーが表示されます。

テンソルの形状 (20, 18) は、提供された形状 (20, 15) と互換性がありません

ただし、完全に新しいプロジェクトを作成すると、機能します。その理由は何ですか?

4

1 に答える 1

0

その理由は、関数コードの以前のエラーのためです。overwriteターナーの変数がFalseデフォルトであるため、オブジェクトが作成され、将来の試行のためにロードされました。また、作成されたオブジェクトの最後のバージョンでは、最初のレイヤーはあなたの例で15変更されました。18

この問題を解決する簡単な解決策 (新しいプロジェクトを作成する代わりに) は、次のように、以前は互換性のなかったオブジェクトを新しい変更で再ロードしないようにoverwrite変数を作成することです。True

# ...
tuner = kt.Hyperband(
            self.build_auto_encoder_model,
            objective='val_loss',
            max_epochs=30,
            hyperband_iterations=20,
            overwrite = True) # here
# ...
于 2021-09-09T18:14:55.373 に答える