5431f9d6创建于 2025年9月18日历史提交
/**
 * Created on 
 *      2025/9/17
 *      2025/9/4 
 *      2025/8/29
 * ----------------
 * package MiniST
 *      main
 */ 

package MiniST

/**
 * 优化说明:
 * 1. 批次级向量化运算(替代单样本循环)
 * 2. 修复数值稳定性问题(Softmax排序、权重初始化)
 * 3. 优化矩阵运算循环顺序(利用缓存局部性)
 * 4. 减少不必要的内存分配和打印操作
 */
public type Matrix<T> = Array<Array<T>>

// 主函数入口
main() {
    println("优化版纯仓颉手写数字识别启动...")

    // 配置参数
    let INPUT_SIZE: Int32 = 784
    let HIDDEN_SIZE: Int32 = 500
    let OUTPUT_SIZE: Int32 = 10
    let LEARNING_RATE: Float32 = 0.005
    let REGULARIZATION: Float32 = 0.01
    let BATCH_SIZE: Int32 = 200
    let EPOCHS: Int32 = 1

    // 1. 加载数据(请替换为实际路径)
    let trainLoader = MiniSTLoader(
        "./dataset/train-images-idx3-ubyte",
        "./dataset/train-labels-idx1-ubyte"
    )
    let (trainImages, trainLabels) = trainLoader.loadData()
    println("训练数据加载完成: ${trainImages.size} 样本")

    let testLoader = MiniSTLoader(
        "./dataset/t10k-images-idx3-ubyte",
        "./dataset/t10k-labels-idx1-ubyte"
    )
    let (testImages, testLabels) = testLoader.loadData()
    println("测试数据加载完成: ${testImages.size} 样本")

    // 2. 拆分训练集和验证集(10%验证集)
    let (trainImgs, trainLbls, valImgs, valLbles) = Trainer.trainValSplit(trainImages, trainLabels, 0.1)
    println("数据拆分完成: 训练集${trainImgs.size}, 验证集${(valImgs.size)}")

    // 3. 初始化网络和训练器
    let network = BPNetwork(INPUT_SIZE, HIDDEN_SIZE, OUTPUT_SIZE, LEARNING_RATE, REGULARIZATION)
    let trainer = Trainer(network, BATCH_SIZE, EPOCHS)

    // 4. 启动训练
    println("开始训练...")
    trainer.train(trainImgs, trainLbls, valImgs, valLbles)

    // 5. 测试集评估
    let testAcc = trainer.accuracy(testImages, testLabels)
    println("训练完成,测试集准确率: ${testAcc}")
}