package org.datavec.inputsplit;
import org.datavec.api.io.filters.BalancedPathFilter;
import org.datavec.api.io.filters.PathFilter;
import org.datavec.api.io.filters.RandomPathFilter;
import org.datavec.api.io.labels.ParentPathLabelGenerator;
import org.datavec.api.split.FileSplit;
import org.datavec.api.split.InputSplit;
import org.nd4j.linalg.io.ClassPathResource;
import java.io.File;
import java.util.Iterator;
import java.util.Random;
/**
* {@link org.datavec.api.split.BaseInputSplit}
* 它的实现提供一个
* {@link org.datavec.api.split.BaseInputSplit#sample(PathFilter, double...)}
* 方法,它用作从主的split中创建多个 {@link org.datavec.api.split.InputSplit}时非常有用
* 这可用于将数据集划分为多个子集。例如,训练、验证和测试。
* 在生成输入拆分数组之前,{@link PathFilter}可用于筛选主拆分。第二个参数是权重列表,它指示每个输入拆分的比例。
*
* 样本按以下方式划分 -> totalSamples * (weight1/totalWeightSum, weight2/totalWeightSum, ...,
* weightN/totalWeightSum)
*
* {@link PathFilter}有两种默认的实现,
* {@link org.datavec.api.io.filters.RandomPathFilter}用于简单的随机化在数组中的路径的顺序
* 与
* {@link org.datavec.api.io.filters.BalancedPathFilter}
* 它随机化数组中的路径顺序并随机删除每个标签的路径让每个标签有相同数量的路径。
* 根据标签进一步交错输出路径,以轻松获得最佳训练批次。
*
* 它们的用法如下
*/
public class Ex05_SamplingBaseInputSplitExample {
public static void main(String[] args) throws Exception{
FileSplit fileSplit = new FileSplit(new ClassPathResource("inputsplit/files").getFile(),new Random(42));
//用一个RandomPathFilter来抽样
InputSplit[] inputSplits1 = fileSplit.sample(new RandomPathFilter(new Random(123), null)
,10, 10, 10, 10, 5);
System.out.println(String.format(("Random filtered splits -> Total(%d) = Splits of (%s)"), fileSplit.length(),
String.join(" + ", () -> new InputSplitLengthIterator(inputSplits1))));
/**用一个BalancedPathFilter来抽样
需要注意的是,BalancedPathFilter抽样出来的总数量=最少样本的标签对应的样本数*标签数
例如,有4个文件夹a,b,c,d对应的样本数量为5,10,15,20使用BalancedPathFilter之后
抽出来的样本总数量=5*4=20个,而不是5+10+15+20=50个
**/
InputSplit[] inputSplits2 = fileSplit.sample(
new BalancedPathFilter(new Random(123), null, new ParentPathLabelGenerator()),
0.8,0.2);
System.out.println(String.format(("Balanced Splits -> Total(%d) = Splits of (%s)"), fileSplit.length(),
String.join(" + ", () -> new InputSplitLengthIterator(inputSplits2))));
}
private static class InputSplitLengthIterator implements Iterator<CharSequence> {
InputSplit[] inputSplits;
int i;
public InputSplitLengthIterator(InputSplit[] inputSplits) {
this.inputSplits = inputSplits;
this.i = 0;
}
@Override
public boolean hasNext() {
return i < inputSplits.length;
}
@Override
public CharSequence next() {
return String.valueOf(inputSplits[i++].length());
}
}
}
翻译:风一样的男子
image
网友评论