Keras在同一网络体系结构上生成不同的model.summary()吗?

时间:2018-08-31 15:15:19

标签: python tensorflow machine-learning keras reinforcement-learning

我在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]

0 个答案:

没有答案