TypeError: __init__() отсутствует 1 обязательный позиционный аргумент: 'units' при использовании класса NoisyDense
Я пытаюсь реализовать в своей модели шумовые сети. Я нашел код на GitHub, который является реализацией класса NoisyDense. Я использовал этот класс внутри своей модели. Вот код: -
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. Я искал похожие проблемы в Stackru и не нашел решения, которое бы работало для моего кода. Кроме того, та же модель работает, когда я не вызываю класс 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'
2 ответа
Спасибо за ваше время, но я получил ответ на аналогичный вопрос на Stackru
"ValueError: Unknown layer:..." при вызове copy.deepcopy(сеть) с использованием Tensorflow
Как видите, класс NoisyDense на Github принимает в качестве аргумента единицу. Поскольку вы не приводите этот аргумент. Вот почему отображается ошибка