深度学习框架有现成方法可以直接使用
步骤基本上一致
/**
* 获取数据
* @param filePath CSV文件路径
* @return NDArray[] 数据集
*/
public static NDArray[] getData( NDManager manager,String filePath){
Table data = Table.read().file(filePath);
Table inputs = data.create(data.columns());
inputs.removeColumns("index","y");
Table outputs = data.select("y");
NDArray features = manager.create(inputs.as().floatMatrix());
NDArray labels = manager.create(outputs.as().floatMatrix());
return new NDArray[] {features, labels};
}
/**
* 获取数据集
* @param x 特征数据
* @param y 标签数据
* @param batchSize 批量大小
* @return ArrayDataset 数据集
*/
public static ArrayDataset getIrisData(NDArray x,NDArray y ,int batchSize){
return new ArrayDataset.Builder()
.setData(x)
.optLabels(y)
.setSampling(batchSize, true) // 批量大小为,随机采样
.build();
}
// 定义损失函数
Loss loss = Loss.softmaxCrossEntropyLoss();
//优化算法
Tracker lrt = Tracker.fixed(lr);
Optimizer sgd = Optimizer.sgd().setLearningRateTracker(lrt).build();
//初始模型配置
DefaultTrainingConfig config = new DefaultTrainingConfig(loss);
config.optOptimizer(sgd);//优化算法
config.optDevices(Engine.getInstance().getDevices(1));//优化指定 GPU 或 CPU
config.addTrainingListeners(TrainingListener.Defaults.logging());//监听
//定义模型
Model model = Model.newInstance("softmax-ir-test");
SequentialBlock net = new SequentialBlock();
net.add(Blocks.batchFlattenBlock(numInputs)); //输入
net.add(Linear.builder().setUnits(numOutputs).build()); //输出
model.setBlock(net);
//训练模型
Trainer trainer = model.newTrainer(config);
trainer.initialize(new Shape(1, numInputs));
//记录训练性能的一些指标,非必须
Metrics metrics = new Metrics();
trainer.setMetrics(metrics);
for (int i = 0; i < numEpochs; i++){
for (Batch batch : trainer.iterateDataset(getIrisData(features, labels, bathSize))) {
EasyTrain.trainBatch(trainer, batch);
trainer.step();
batch.close();
}
}
TrainingResult result = trainer.getTrainingResult();
2008

被折叠的 条评论
为什么被折叠?



