Моя сетевая архитектура, определенная в Keras ( См. Кодовый блок 2 ), создает два разных описания модели, когда я вызываю ее дважды ( См. Кодовый блок 1 ). Один из них (targetModel, в ссылках на изображения ниже) является правильным, а другой (mainModel) немного ошибочным. Он добавляет model_3 (Модель) (Нет, 5) 219737 в качестве второго слоя, которого нет в правильной сводке. Все остальное правильно.
Краткое содержание модели -
targetModel - Сводка модели , здесь сгенерирована правильная модель.
mainModel - Сводка модели , обратите внимание на слой модели во втором ряду. Я не упоминал мою модель в архитектуре нигде в коде.
Ошибка - Из-за этого, я подозреваю, я получаю ошибку, когда она запускается, * полный код находится в блоке кода 3 * -
wTarget[i] = self.tau * wMain[i] + (1 - self.tau) * wTarget[i]
ValueError: operands could not be broadcast together with shapes (300,300) (3,)
1. - та же сеть, определенная ниже, сохранена в двух местах -
self.mainModel, self.mainModel_weights, self.mainModel_state = self._build_model()
self.targetModel, self.targetModel_weights, _ = self._build_model()
2. - Сетевая архитектура, определенная ниже -
def _build_model(self):
ky_list = ActorNetwork.k_list
ky_list = tf.stack(ky_list, axis=1)
input_obs = Input(shape=(self.state_dim,))
keys = Input(shape=ky_list.shape)
h = Dense(400, name="first_layer")(input_obs)
h = Activation('relu')(h)
# h = BatchNormalization()(h)
query = Dense(300, name="keys_layer")(h)
a1 = Lambda(lambda x: tf.einsum('bi,bij->bij', x[0], x[1]) / np.sqrt(300))([query, keys])
attn = Activation('softmax')(a1)
attn = Dropout(0.1)(attn)
attn = BatchNormalization()(attn)
attn_out = Lambda(lambda x: tf.einsum('bij,bij->bi', x[0], x[1]))([attn, keys])
attn_add = Add()([query, attn_out])
h = Dense(300, name="third_layer")(attn_add)
h = Activation('relu')(h)
h = Dense(self.action_dim, name="output_action")(h)
# h = Activation('softmax')(hs)
pred = Activation('tanh')(h)
pred = BatchNormalization()(pred)
model = Model(inputs=[input_obs, keys], outputs=pred)
model.compile(optimizer='Adam', loss='categorical_crossentropy')
return model, model.trainable_weights, input_obs
3. - Я бы хотел добавить вес системы.
wMain = np.asarray(self.mainModel.get_weights())
print(wMain.shape, 'wMain', '\n\n')
print(self.mainModel.summary(), '\n\n')
# print(self.mainModel.get_weights(), '\n\n')
wTarget = np.asarray(self.targetModel.get_weights())
print(wTarget.shape, 'wTarget', '\n\n')
print(self.targetModel.summary(), '\n\n')
# print(self.targetModel.get_weights(), '\n\n')
for i in range(len(wMain)):
wTarget[i] = self.tau * wMain[i] + (1 - self.tau) * wTarget[i]