public unsafe TrainValInfo getInfo(void *param) { TrainValInfo info = new TrainValInfo(); sbyte * p = (sbyte *)param; info.iterNum = *(int *)p; p += 4; info.numOutput = *(int *)p; p += 4; float *values = *(float **)p; p += sizeof(void *); if (info.numOutput > 0) { info.values = new float[info.numOutput]; for (int i = 0; i < info.numOutput; ++i) { info.values[i] = values[i]; } sbyte **names = *(sbyte ***)(p); info.outputNames = new string[info.numOutput]; for (int i = 0; i < info.numOutput; ++i) { info.outputNames[i] = new string(names[i]); } } return(info); }
//下面是训练的代码 public unsafe int trainCallback(int eventFlag, int param1, float param2, void *param3) { if (eventFlag == 3 && param1 > 10) { return(2); } if (eventFlag == 7) { TrainValInfo info = getInfo(param3); Debug.WriteLine(info); } Debug.WriteLine("{0}, {1}, {2}", eventFlag, param1, param2); return(0); }
public unsafe int trainCallback(int eventFlag, int param1, float param2, void *param3) { /* * #训练事件_初始化网络 1 * #训练事件_初始化网络完成 2 * #训练事件_完成一次迭代 3 * #训练事件_测试开始 6 * #训练事件_测试完毕 7 * #训练事件_快照完毕 5 * #训练事件_训练完成 4 * #控制信号_无操作 0 * #控制信号_停止训练 2 * #控制信号_快照 1 * */ try { switch (eventFlag) { case 1: Log("初始化网络"); break; case 2: Log("初始化网络完成"); break; case 3: if (exit) { return(2); } if (param1 == interation) { interation += step; Log($"完成一次迭代,次数:{param1}, 损失:{param2}"); return(1); } break; case 6: Log("测试开始"); break; case 7: TrainValInfo info = getInfo(param3); if (info.values[0] > 0.99) { WriteLog($"高精度出现,第{info.iterNum}次迭代,{info.values[0] * 100}%,accuracy:{info.values[0]},ctc_loss = {info.values[1]} (* 1 = {info.values[1]} loss)"); } Log($"测试完毕,accuracy:{info.values[0]},ctc_loss = {info.values[1]} (* 1 = {info.values[1]} loss)"); break; case 5: Log("快照完毕"); break; case 4: Log("训练完成"); break; } return(0); } catch (Exception ex) { WriteLog2(ex.ToString()); return(0); } }