ConvNetSharp性能优化及EEG数据网络设计技术问询
性能优化与网络设计问题
一、性能优化需求
我在时间敏感型应用中使用ConvNetSharp包,测试net.Forward功能性能时,本机运行Classify2DDemo程序单输入预测耗时约6-7毫秒。本机配置:
- CPU:2.6 GHz
- 内存:16 GB
- 系统:Win11 64位
- 显卡:NVIDIA GeForce GTX 1650 Ti
希望将预测时间从7毫秒降至2毫秒,提出以下问题:
- 要使Classify2DDemo程序的
net.Forward功能最优运行,需采用哪些标准配置? - 有哪些方案可将处理时间从7毫秒降至2毫秒?
二、网络设计细节确认(EEG信号处理场景)
补充说明:我实际用ConvNetSharp做EEG信号处理,头带含4个电极,每个电极采集500个样本的epoch,共3000+段epoch用于训练,网络设计代码如下:
using ConvNetSharp.Core.Training; using ConvNetSharp.Core; using ConvNetSharp.Core.Layers.Double; using System; using ConvNetSharp.Volume; using ConvNetSharp.Volume.Double; public class CNNModelTraining { public const int iterations = 40; public const int featureNumber = 2000; public const int featuresWithLabels = 2001; public CNNModelTraining() { BuilderInstance<double>.Volume = new VolumeBuilder(); } public ConvNetSharp.Core.Net<double> CreateCNNNetwork() { ConvNetSharp.Core.Net<double> net1 = new Net<double>(); net1.AddLayer(new InputLayer(500, 4, 1)); net1.AddLayer(new ConvLayer(5, 2, 20) { Stride = 2, Pad = 0 }); net1.AddLayer(new ReluLayer()); net1.AddLayer(new PoolLayer(2, 1)); net1.AddLayer(new ConvLayer(3, 1, 30) { Stride = 2, Pad = 0 }); net1.AddLayer(new ReluLayer()); //net1.AddLayer(new PoolLayer(3, 1)); net1.AddLayer(new FullyConnLayer(3)); net1.AddLayer(new SoftmaxLayer(3)); return net1; } public TrainerBase<double> GetTrainerForNetwork(Net<double> paramNet) { return new AdamTrainer<double>(paramNet) { LearningRate = 0.00003, BatchSize = 30 }; } public static void TrainModel(double[][] jaggedBalancedData, double[][] outputArray, TrainerBase<double> trainerParam, ConvNetSharp.Core.Net<double> net1Param) { Console.WriteLine("Starting to train the network ..."); Console.WriteLine(outputArray.GetLength(0)); Console.WriteLine(jaggedBalancedData.GetLength(0)); var netx = BuilderInstance.Volume.SameAs(new Shape(500, 4, 1, jaggedBalancedData.GetLength(0))); var hotLabels = BuilderInstance.Volume.SameAs(new Shape(1, 1, 1, outputArray.GetLength(0))); for (var ix = 0; ix < outputArray.GetLength(0); ix++) //Swati { Console.WriteLine($"{ix} {(int)outputArray[ix][0]}"); hotLabels.Set(0, 0, 0, ix, (int)outputArray[ix][0]); for (var featureGrp = 0; featureGrp < 4; ++featureGrp) { for (int features = 0; features < 500; ++features) netx.Set(features, featureGrp, 0, ix, jaggedBalancedData[ix][features + (featureGrp * 500)]); } } for (var iters = 0; iters < CNNModelTraining.iterations; iters++) { trainerParam.Train(netx, hotLabels); Console.WriteLine(trainerParam.Loss); } } }
需确认以下问题:
- 单样本输入层
InputLayer(500, 4, 1)设计是否正确?库内部会按“4组500样本”还是“500组4样本”处理?若为后者,训练和预测结果会出错。 - 第一个
ConvLayer(5, 2, 20)是否会处理所有4个电极?还是必须设为(5, 4, 20)才能覆盖所有电极? - 代码中的
PoolLayer是平均池化层还是最大池化层?
内容的提问来源于stack exchange,提问作者Swati Shah
相关产品推荐
相关产品推荐

