我在Keras中定义的网络体系结构(参考代码块2 )创建了两个不同的模型摘要,当我两次调用它时(参考代码块1 )。其中一个(targetModel,在下面的图像链接中)是正确的,但另一个(mainModel)是错误的。它将 model_3(模型)(无,5)219737 添加为第二层,该层未出现在正确的摘要中。其他一切都正确。
模型摘要-
targetModel - Model Summary,在此处生成正确的模型。
mainModel - Model Summary,请注意第二行中的模型层。我没有在代码中的任何地方引用我的模型。
错误-因此,我怀疑运行此错误时,*完整代码位于代码块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]