0

モデルにNoisy Netsを実装しようとしています。NoisyDense Classの実装であるコードを GitHub で見つけました。モデル内でこのクラスを使用しました。ここにコード: -


class Agent:

    def __init__(self, state_size, strategy="t-dqn", reset_every=1000, pretrained=False, model_name=None):
        self.strategy = strategy

        # agent config
        self.state_size = state_size        
        self.action_size = 3                
        self.model_name = model_name
        self.inventory = []
        self.buffer = []
        self.first_iter = True
        self.nstep = 5
        self.n_step_buffer = deque(maxlen = self.nstep)
        self.cnt = count()
        self.alpha = 0.6
        self.model_name = model_name
        self.gamma = 0.95 # affinity for long term reward
        self.epsilon = 1.0
        self.epsilon_min = 0.01
        self.epsilon_decay = 0.995
        self.learning_rate = 0.001
        self.loss = huber_loss
        self.custom_objects = {"huber_loss": huber_loss}  # important for loading the model from memory
        self.optimizer = Adam(lr=self.learning_rate)

        if pretrained and self.model_name is not None:
            self.model = self.load()
        else:
            self.model = self._model()

        # strategy config
        if self.strategy in ["t-dqn", "double-dqn"]:
            self.n_iter = 1
            self.reset_every = reset_every

            # target network
            self.target_model = clone_model(self.model)
            self.target_model.set_weights(self.model.get_weights())
    def _model(self):
         model = Sequential()
         model.add(Dense(units=128, activation="relu", input_dim=self.state_size))
         model.add(Dense(units=256, activation="relu"))
         model.add(Dense(units=256, activation="relu"))
         model.add(NoisyDense(128, activation="relu"))
         model.add(NoisyDense(self.action_size + 1, activation='linear'))
         model.compile(loss=self.loss, optimizer=self.optimizer)
         return model

しかし、エラーが発生しました。解決方法がわからないようです。NoisyDense の実装も確認してください。StackOverflow で同様の問題を探しましたが、自分のコードで機能する解決策が見つかりませんでした。また、NoisyDense クラスを呼び出さずに Dense レイヤーを使用した場合も、同じモデルが機能します。トレースバックの Train.py ファイルは、エージェント クラスを呼び出しますが、これ以上重要なことはないと思います。使用されるモデルは Keras モデルで、そのバージョンは 2.3.1 です

Traceback (most recent call last):
  File "train.py", line 85, in <module>
    pretrained=pretrained, debug=debug)
  File "train.py", line 52, in main
    agent = Agent(window_size, strategy=strategy, pretrained=pretrained, model_name=model_name)
  File "C:\Users\Desktop\agent.py", line 158, in __init__
    self.target_model = clone_model(self.model)
  File "D:\anaconda\lib\site-packages\keras\models.py", line 255, in clone_model
    return _clone_sequential_model(model, input_tensors=input_tensors)
  File "D:\anaconda\lib\site-packages\keras\models.py", line 207, in _clone_sequential_model
    layers = [clone(layer) for layer in model.layers]
  File "D:\anaconda\lib\site-packages\keras\models.py", line 207, in <listcomp>
    layers = [clone(layer) for layer in model.layers]
  File "D:\anaconda\lib\site-packages\keras\models.py", line 205, in clone
    return layer.__class__.from_config(layer.get_config())
  File "D:\anaconda\lib\site-packages\keras\engine\base_layer.py", line 1179, in from_config
    return cls(**config)
TypeError: __init__() missing 1 required positional argument: 'units'
4

2 に答える 2