Ошибка типа: __init__() получил несколько значений для аргумента ‘strides’

#python #keras #conv-neural-network

#python #keras #conv-нейронная сеть

Вопрос:

Модель Nvidia показывает ошибку для шагов, даже если я инициализирую их значением по умолчанию (1,1) Я использую «шаги» в качестве замены аргумента «подвыборка» в предыдущих версиях keras. может кто-нибудь объяснить новый синтаксис их использования.

 def nvidia_model():
  model = Sequential()
  model.add(Conv2D(24,5,5, strides = (2,2), input_shape= (66,200,3), activation='relu'))
  model.add(Conv2D(36,5,5, strides = (2,2), activation = 'relu'))
  model.add(Conv2D(48,5,5, strides = (2,2), activation = 'relu'))
  model.add(Conv2D(64,3,3, activation = 'relu'))
  model.add(Conv2D(64,3,3, activation = 'relu'))
  model.add(Dropout(0.5))                                               #50% nodes turned to zero

  model.add( Flatten())
  model.add(Dense(100, activation ='relu'))
  model.add(Dropout(0.5))

  model.add(Dense(50, activation ='relu'))
  model.add(Dense(10, activation ='relu'))
  model.add(Dense(1))
  
  optimizer = Adam(lr = 1e-3)
  model.compile(loss = 'mse' , optimizer = optimizer)
  return model

model = nvidia_model()
print(model.summary)

  
 Error:
TypeError                                 Traceback (most recent call last)
<ipython-input-83-aff2a2709b79> in <module>()
----> 1 model = nvidia_model()
      2 print(model.summary)

<ipython-input-82-7942ade664af> in nvidia_model()
      1 def nvidia_model():
      2   model = Sequential()
----> 3   model.add(Conv2D(24,5,5, strides = (2,2), input_shape= (66,200,3), activation='relu'))
      4   model.add(Conv2D(36,5,5, strides = (2,2), activation = 'relu'))
      5   model.add(Conv2D(48,5,5, strides = (2,2), activation = 'relu'))

TypeError: __init__() got multiple values for argument 'strides'
  

Ответ №1:

 model.add(Conv2D(24,5,5, strides = (2,2), input_shape= (66,200,3), activation='relu'))
model.add(Conv2D(36,5,5, strides = (2,2), activation = 'relu'))
model.add(Conv2D(48,5,5, strides = (2,2), activation = 'relu'))
  

Для этих строк используйте круглые скобки, как в следующем примере

 model.add(Conv2D(24,(5,5), strides = (2,2), input_shape= (66,200,3), activation='relu'))
model.add(Conv2D(36,(5,5), strides = (2,2), activation = 'relu'))
model.add(Conv2D(48,(5,5), strides = (2,2), activation = 'relu'))
  

Ответ №2:

Я никогда не работал с tensorflow , но согласно документации Conv2D он определяется как

 tf.keras.layers.Conv2D(
    filters, kernel_size, strides=(1, 1), padding='valid', data_format=None,
    dilation_rate=(1, 1), groups=1, activation=None, use_bias=True,
    kernel_initializer='glorot_uniform', bias_initializer='zeros',
    kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None,
    kernel_constraint=None, bias_constraint=None, **kwargs
)
  

Как вы можете видеть strides , это третий параметр.

Теперь вы используете Conv2D(24,5,5, strides = (2,2), input_shape= (66,200,3), activation='relu') where третий параметр 5 , а затем пытаетесь установить strides снова с помощью параметра ключевого слова. Кажется, в вашем вызове слишком много одного параметра.

Представьте, что маленький Python gnome обрабатывает ваш код: «Хорошо, босс хочет экземпляр Conv2D . Он устанавливает первый аргумент filters 4 равным, второй аргумент kernel_size 2 равным и третий аргумент strides 2 равным . Сделано с позиционными аргументами. Теперь давайте продолжим с аргументами ключевого слова. Здесь у нас есть strides и … о, у меня уже есть strides , так что я не знаю, что делать. Босс может разозлиться, поэтому я расскажу ему, что именно произошло. TypeError: __init__() got multiple values for argument 'strides'

Комментарии:

1. Теперь я чувствую себя идиотом, потому что это сработало, указав размер ядра в скобках, lol. спасибо, брат