本节概述了将你的训练有素的python模型与研究者平台用户界面的整合。

超参数


尽管我们一直在寻求扩大我们平台上支持的框架和模型类型,但我们一开始的范围相对较窄。我们目前支持全连接的前馈神经网络。此外,输入维度不能改变。这意味着,研究人员必须使用我们构建的特征。在 神经网络 的架构部分,我们解释了为什么我们做出这个决定。

我们目前支持的一组激活函数应该足以满足大多数模型的需要。然而,如果你想得到其他方面的支持,请在Discord中与我们联系。

输入 → 输出的映射


如果你想为你的模型编写一个自定义的代理来进行训练,你必须创建一个有 select_action 方法的类。这个方法必须把状态作为一个输入,并返回代理将采取的行动的索引。

我们发现首先创建一个从行动名称到索引的映射比较容易。这样我们就可以在 select_action 方法中使用动作名称(因为在处理整数时很容易混淆动作),然后在最后将名称送入映射。

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_featuresn_actions 分别代表输入(状态空间)和输出(动作空间)的维度。

neurons 代表每个隐藏层中的神经元数量。例如,neurons = [48, 32, 24] 意味着第一层有48个神经元,第二层有32个,第三层有24个。

<aside> 💡 在上面的例子中,24不是输出层的维度。它是最后一个隐藏层(即输出前的那一层)的维度。

</aside>

最后,weightsbiases 被表示为权重/偏差矩阵的列表。

<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> ⬅️ 上一页

</aside>

<aside> ↩️ 返回

</aside>