You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将基于FEN训练的Keras模型预测输出转换为国际象棋走法?

问题:将Keras模型的预测概率转换为国际象棋走法

我用数千组包含国际象棋局面(FEN格式)及对应走法的数据训练了Keras模型,目标是让模型根据输入的FEN输出预测走法。训练代码如下:

def train(X, y):
    # Split the data into training and test sets
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.001, random_state=42)
    
    # Preprocess the data (you may need to implement FEN2ARRAY function for neural network input)
    X_train_processed = FEN2ARRAY(X_train)
    X_test_processed = FEN2ARRAY(X_test)
    
    # Encode the target variable (moves) for categorical classification
    label_encoder = LabelEncoder()
    label_encoder.fit(y_train)
    y_train_encoded = label_encoder.transform(y_train)
    y_test_encoded = label_encoder.transform(y_test)
    num_classes = len(label_encoder.classes_)
    
    # Convert target variable to one-hot encoded format
    y_train_categorical = to_categorical(y_train_encoded, num_classes=num_classes)
    y_test_categorical = to_categorical(y_test_encoded, num_classes=num_classes)
    
    # Define the neural network architecture
    model = Sequential()
    model.add(Dense(128, activation='relu', input_shape=(64,)))  # Adjust input_shape based on your input data
    model.add(Dense(64, activation='relu'))
    model.add(Dense(num_classes, activation='softmax'))  # Use softmax activation for multi-class classification
    
    # Compile the neural network model
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
    
    # Train the neural network model
    model.fit(X_train_processed, y_train_categorical, epochs=10, batch_size=32, validation_data=(X_test_processed, y_test_categorical))
    
    return model

执行预测代码时:

prediction = model.predict(FEN2ARRAY("8/8/6p1/5k1p/4Rp1P/5P2/p5PK/r7 w - - 8 48"))
print(prediction)

得到的输出是:

1/1 [==============================] - 0s 83ms/step
[[9.8108569e-05 2.6935700e-04 9.9022780e-04 ... 2.1389520e-03
  1.9414679e-04 1.4036804e-03]]

请问如何将该输出转换为具体的国际象棋走法?


解决方案

1. 保存训练时使用的LabelEncoder实例

你的训练代码中,label_encoder仅在函数内部创建,训练结束后会被销毁。必须保存这个编码器,才能在预测时反转编码得到原始走法。可以用joblib或pickle保存:

# 在train函数末尾添加保存逻辑
import joblib

def train(X, y):
    # 原训练代码...
    
    # 保存编码器
    joblib.dump(label_encoder, 'chess_move_encoder.pkl')
    
    return model

2. 加载编码器并转换预测结果

预测时,先加载保存的编码器,然后找到概率最高的索引,再通过inverse_transform方法转换为具体走法:

import numpy as np
import joblib

# 加载训练好的模型和编码器
model = ...  # 加载你的Keras模型(例如用model.load_weights或load_model)
label_encoder = joblib.load('chess_move_encoder.pkl')

# 处理预测结果
prediction = model.predict(FEN2ARRAY("8/8/6p1/5k1p/4Rp1P/5P2/p5PK/r7 w - - 8 48"))
# 获取概率最高的走法索引
best_move_idx = np.argmax(prediction)
# 反转编码得到原始走法
best_move = label_encoder.inverse_transform([best_move_idx])[0]

print(f"预测最佳走法:{best_move}")

3. 可选:获取Top N候选走法

如果需要查看概率排名靠前的多个走法,可以这样实现:

# 获取前3个概率最高的索引(降序排列)
top_n_idx = np.argsort(prediction[0])[-3:][::-1]
# 转换为走法和对应概率
top_moves = [(label_encoder.inverse_transform([idx])[0], prediction[0][idx]) for idx in top_n_idx]

print("Top 3预测走法:")
for move, prob in top_moves:
    print(f"{move}: {prob:.4f}")

注意事项

  • 必须保证预测时使用的label_encoder和训练时的是同一个,否则反转编码会出现错误映射。
  • 如果之前的训练没有保存编码器,需要重新训练并保存,或者修改训练流程保留编码器实例。

内容的提问来源于stack exchange,提问作者MessiSkillz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 02:34:53