#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