Как я могу сохранить эту модель (ы) и почему используется для "с tf.Graph (). As_default ()" - PullRequest
2 голосов
/ 11 апреля 2020

Я пытался тренироваться, а затем скомпилировать этот RL al go. Моя проблема возникает, когда я хочу сохранить три модели.

Вот как определяются нейронные сети:

def build_networks(state_shape, action_size, learning_rate, critic_weight,
               hidden_neurons, entropy):

state_input = layers.Input(state_shape, name='frames')
advantages = layers.Input((1,), name='advantages')  # PG, A instead of G

# PG
actor_1 = layers.LSTM(input_shape = (1,4),units=hidden_neurons, return_sequences = True)(state_input)
actor_2 = layers.LSTM(input_shape = (1,4), units=hidden_neurons, return_sequences = False)(actor_1)
probabilities = layers.Dense(action_size, activation='softmax')(actor_2)

# DQN
critic_1 = layers.LSTM(input_shape = (1,4), units = hidden_neurons, return_sequences = True)(state_input)
critic_2 = layers.LSTM(input_shape = (1,4), units=hidden_neurons, return_sequences = False)(critic_1)
values = layers.Dense(1, activation='linear')(critic_2)

def actor_loss(y_true, y_pred):  # PG
    #cusom loss-do stuff

# Train both actor and critic at the same time.
actor = models.Model(
    inputs=[state_input, advantages], outputs=[probabilities, values])
actor.compile(
    loss=[actor_loss, 'mean_squared_error'],  # [PG, DQN]
    loss_weights=[1, critic_weight],  # [PG, DQN]
    optimizer=tf.keras.optimizers.Adam(lr=learning_rate))

critic = models.Model(inputs=[state_input], outputs=[values])
policy = models.Model(inputs=[state_input], outputs=[probabilities])
return actor, critic, policy

Как вы можете видеть, единственная NN, которая использует компиляцию, - это субъект , Как я могу сохранить три NN для дальнейшего использования? Нужно ли сохранять их отдельно или мне нужно сохранить три NN как один? Кроме того, когда я пытался сохранить их, я использовал эту строку:

with tf.Graph().as_default():
    test_agent.actor.save_weights("Test_agent_actor.h5")
    test_agent.critic.save_weights("Test_agent_critic.h5")
    test_agent.policy.save_weights("Test_agent_policy.h5")

Но когда я пытаюсь загрузить любой из них, он говорит, что:

WARNING:tensorflow:No training configuration found in save file: the model was *not* compiled. Compile it manually.
WARNING:tensorflow:Output dense missing from loss dictionary. We assume this was done on purpose. The fit and evaluate APIs will not be expecting any data to be passed to dense.

Даже когда я пытаюсь использовать NN в наборе данных проверки / тестирования, я получаю сообщение об ошибке, которое говорит мне, что:

InvalidArgumentError: Tensor frames:0, specified in either feed_devices or fetch_devices was not found in the Graph

Или, когда я пытаюсь снова сохранить NN, он говорит мне что-то о "оборванных" и размере файла идет от 25 МБ до 1 КБ. Почему это? Что я делаю не так? Должен ли я использовать .hdf5 вместо .h5?

А также, я тренирую все это с этой частью кода:

with tf.Graph().as_default():
     #do some stuff

Почему это для? Почему я должен использовать это, а также использовать import tensorflow.keras вместо import keras?

Заранее спасибо!

...