Как преобразовать тензор кераса в массив numpy

#python #arrays #numpy #keras #deep-learning

Вопрос:

Я пытаюсь создать шахматный движок q-обучения, в котором вывод последнего слоя нейронной сети (плотность равна количеству законных ходов) выполняется с помощью функции argmax (), которая возвращает целое число, которое я использую в качестве индекса для массива, в котором хранятся законные ходы. Вот часть моего кода:

 #imports

env = gym.make('ChessAlphaZero-v0')   #builds environment
obs = env.reset()
type(obs)

done = False   #game is not won

num_actions = len(env.legal_moves)   #array where legal moves are stored

obs = chess.Board() 

model = models.Sequential()

def dqn(board):
    
    #dense layers
    
    action = layers.Dense(num_actions)(layer5)
    
    i = np.argmax(action)
    move = env.legal_moves[i]

    return keras.Model(inputs=inputs, outputs=move)
 

Но когда я запускаю код, я получаю следующую ошибку:

 TypeError: Cannot convert a symbolic Keras input/output to a numpy array. This error may indicate that you're trying to pass a symbolic value to a NumPy call, which is not supported. Or, you may be trying to pass Keras symbolic inputs/outputs to a TF API that does not register dispatching, preventing Keras from automatically converting the API call to a lambda layer in the Functional Model.
 

Любые примеры кода будут оценены по достоинству, спасибо.

Комментарии:

1. Вы не можете вызвать np.argmax() Dense объект. Попробуйте обернуть argmax операцию Lambda слоем. Обратитесь к этому .

Ответ №1:

Правильный способ построения модели и передачи входных данных в keras заключается в следующем:

1. Построение модели

 model = models.Sequential()
model.add(layers.Input(observation_shape))
model.add(layers.Dense(units=128, activation='relu'))
model.add(layers.Dense(units=num_actions, activation='softmax'))
return model
 

или

 inputs = layers.Input(observation_shape)
x = layers.Dense(units=128, activation='relu')(inputs)
outputs = layers.Dense(units=num_actions, activation='softmax')(x)

model = keras.Model(inputs, output)
 

Оба пути равны.

2. Направьте наблюдение и получите наилучшие возможные действия

 action_values = model.predict(observation)
best_action_index = tf.argmax(action_values)
best_action = action_values[best_action_index]
 

Реализация DQN самостоятельно в keras может быть довольно неприятной. Возможно, вы захотите использовать платформу DRL, такую как tf_agents, в которой реализовано множество агентов:
https://www.tensorflow.org/agents

Этот репозиторий содержит чистую и легкую для понимания реализацию DQN для сред openai gym. Кроме того, он содержит примеры использования библиотеки tf_agents и для более сложных агентов:
https://github.com/kochlisGit/Tensorflow-DQN