Keras генерирует разные model.summary () в одной сетевой архитектуре? - PullRequest
0 голосов
/ 31 августа 2018

Моя сетевая архитектура, определенная в 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]
...