В этом разделе описывается интеграция вашей обученной python-модели в пользовательский интерфейс платформы исследователя.

Гиперпараметры


Хотя мы всегда стремимся расширить рамки и типы моделей, поддерживаемых нашей платформой, мы начали с относительно узкой области. В настоящее время мы поддерживаем полносвязные нейронные сети с прямолинейным движением. Кроме того, размерность входных данных не может быть изменена. Это означает, что исследователи должны использовать те функции, которые мы создали. В архитектурной части Нейронные сети мы объясняем, почему мы приняли такое решение.

Текущий набор функций активации, который мы поддерживаем, должен быть достаточным для большинства моделей. Однако если вы хотите получить поддержку других функций, свяжитесь с нами в Discord.

Input → Output Mapping


Если вы хотите создать пользовательского агента для обучения вашей модели, вы должны создать класс с методом select_action. Этот метод должен принимать состояние в качестве входных данных и возвращать индекс действия, которое будет выполнять агент.

Мы считаем, что проще сначала создать mapping между именами действий и индексами. Таким образом, мы можем использовать имена действий в методе select_action (поскольку легко перепутать действия при работе с целыми числами), а затем подставить имя в mapping в конце.

actions_list = [
    "Run Left",
    "Run Right",
    "Single Punch",
    "Double Punch",
    "Defend",
    "Jump",
    "Jump Left",
    "Jump Right",
    "Jump Punch",
    "Low Kick"
]

action_to_idx_mapping = {}
for i in range(len(actions_list)):
    action_to_idx_mapping[actions_list[i]] = i

Теперь мы можем инициализировать класс с помощью простой политики следующим образом:

class CustomAgent():
  def __init__(self):
      self.type = "rules-based-agent"

  def select_action(self, state):
    (
        relative_distance,
        you_facing_opponent,
        opponent_facing_you,
        your_health,
        opponent_health,
        relative_strength,
        relative_speed,
        relative_defence,
        relative_accuracy
    ) = state[0]
		
		action = "Single Punch"
		if abs(relative_distance < 0.1):
				if (relative_distance < 0):
						action = "Run Right"
				else:
						action = "Run Left"

		return action_to_idx_mapping[action]

Экспорт JSON


Экспорт модели должен представлять собой JSON-файл и соответствовать следующей схеме:

{
	"activation_function": String,
	"output_activation": String,
	"n_features": Number,
	"n_actions": Number,
	"neurons": [Number],
	"weights": [[[Number]]],
	"biases": [[[Number]]],
}

В настоящее время мы поддерживаем одну функцию активации, которая применяется ко всем скрытым слоям.

В файле JSON она представлена именем функции активации, написанным строчными буквами. Выходная функция активации также представлена своим именем.

n_features и n_actions представляют размерность вводов (пространство состояний) и выводов (пространство действий), соответственно.

нейроны представляет количество нейронов в каждом скрытом слое. Например, neurons = [48, 32, 24] означает, что в первом слое 48 нейронов, во втором - 32, а в третьем - 24.

<aside> 💡 В приведенном выше примере 24 - это не размерность выходного слоя. Это размерность последнего скрытого слоя (т.е. слоя непосредственно перед выводом).

</aside>

Наконец, веса и смещения представлены в виде списка матриц весов/ смещений.

<aside> 💡 Ваши весовые матрицы должны соответствовать стандарту, где строки соответствуют размерности ввода, а столбцы - размерности вывода. Если вы предпочитаете работать со столбцами как вводами и строками как выводами, то транспонируйте ваши матрицы при экспорте в JSON.

</aside>

Ниже приведен пример экспорта модели PyTorch:

def save_pytorch_model(model):
    weights_data = []
    bias_data = []
    for layer in model.layers:
        current_parameters = [model.tensor_to_array(params) for params in layer.parameters()]
        weights_data.append([current_parameters[0].tolist()])
        bias_data.append([current_parameters[1].tolist()]) 

    model_data = {
        "activation_function": model.activation_function.__name__,
        "output_activation": model.output_activation.__name__,
        "n_features": model.n_features,
        "n_actions": model.n_actions,
        "neurons": list(model.neurons),
        "weights": weights_data,
        "biases": bias_data
    }
    
    json_string = json.dumps(model_data)
    with open('saved_model/model_pytorch.json', 'w') as outfile:
        outfile.write(json_string)

<aside> ⬅️ Previous

</aside>

<aside> ↩️ Return

</aside>