什么是迭代器?
数据集迭代器允许将数据轻松加载到神经网络中,并帮助组织批处理、转换和掩码。包含在Eclipse DL4J中的迭代器有助于用户提供的数据,或者自动加载公共的基准数据集如MNIST和IRIS。
用法
对于大多数用例,初始化迭代器和传递一个引用到MultiLayerNetwork
或ComputationGraph 的fit
()方法是开始训练任务所需的全部内容:
MultiLayerNetwork model = new MultiLayerNetwork(conf);
model.init();
// 传入一个 MNIST 数据集迭代器,自动获取数据
DataSetIterator mnistTrain = new MnistDataSetIterator(batchSize, true, rngSeed);
net.fit(mnistTrain);
许多其他方法也接受迭代器来完成任务,例如评估:
// 直接传递给神经网络
DataSetIterator mnistTest = new MnistDataSetIterator(batchSize, false, rngSeed);
net.eval(mnistTest);
//使用一个评估类
Evaluation eval = new Evaluation(10); //创建一个带有10个可能分类的评估对象
while(mnistTest.hasNext()){
DataSet next = mnistTest.next();
INDArray output = model.output(next.getFeatureMatrix()); //得到网络预测
eval.eval(next.getLabels(), output); //检查对真实分类的预测
}
可用的迭代器
CifarDataSetIterator (CIFAR10数据集迭代器)
CifarDataSetIterator是CIFAR10数据集的迭代器,10个分类,32x32图像 3通道(RGB)还支持用于基于Sergey Zagoruyko示例https://github.com/szagoruyko/cifar.torch 对数据集进行归一化的特殊预处理器。
CifarDataSetIterator
public CifarDataSetIterator(int batchSize, int numExamples)
用创建器返回的batchSize与numExamples加载图片。
next
public DataSet next(int batchSize)
用创建器返回的batchSize、numExamples与version加载图片。
EmnistDataSetIterator (EMNIST 数据集迭代器)
EMNIST 数据集迭代器
- COMPLETE: 也称为 “ByClass” 分割。 共计814,255 个示例(训练 + 测试), 62 个分类
- MERGE: 也称为“ByMerge”分割。共计814255个示例。47个不平衡分类。对于字母C、I、J、K、L、M、O、P、S、U、V、W、X、Y和Z,为每个字母(而不是2个)将小写字母和大写字母(难以区分)组合为一个类
- BALANCED: 总计 131,600 示例。 47 个分类 (每个分类都有相同数量的例子)
- LETTERS: 总计145,600 示例。 26 个平衡分类。
- DIGITS: 总计 280,000 示例。 10 个平衡分类。
查看: https://www.nist.gov/itl/iad/image-group/emnist-dataset 和 https://arxiv.org/abs/1702.05373
EmnistDataSetIterator
public EmnistDataSetIterator(Set dataSet, int batch, boolean train) throws IOException
EMNIST 数据集有多个不同的子集。 详见 {- link EmnistDataSetIterator}。
numExamplesTrain
public static int numExamplesTrain(Set dataSet)
基于指定的RNG种子创建具有随机混洗数据的EMNIST迭代器
- 参数 dataSet 用于返回的数据集
- 参数 batchSize批量大小
- 参数 train 如果为 true: 使用训练集。 如果 false: 使用测试集
- 参数 seed Random number generator seed
numExamplesTest
public static int numExamplesTest(Set dataSet)
获取指定子集的测试示例数。
- 参数 dataSet 获取的子集
- 返回指定子集的示例数
numLabels
public static int numLabels(Set dataSet)
获取指定子集的标签数量
- 参数 dataSet 要获取的子集
- 返回指定子集的标签数
isBalanced
public static boolean isBalanced(Set dataSet)
[图片上传失败...(image-43c115-1542371094659)]
在训练集中标签是否平衡(即:每个标签的实例数是否相等)?
- 返回true或false
UciSequenceDataSetIterator (UCI数据库是加州大学欧文分校(University of CaliforniaIrvine)提出的用于机器学习的数据库,这个数据库目前共有335个数据集,其数目还在不断增加,UCI数据集是一个常用的标准测试数据集。)
UCI合成控制图时间序列数据集。该数据集可用于六类单变量时间序列的分类:正常,周期性,递增趋势,递减趋势,向上移位,向下移位
详情: https://archive.ics.uci.edu/ml/datasets/Synthetic+Control+Chart+Time+Series
数据: https://archive.ics.uci.edu/ml/machine-learning-databases/synthetic_control-mld/synthetic_control.data
图片: https://archive.ics.uci.edu/ml/machine-learning-databases/synthetic_control-mld/data.jpeg
UciSequenceDataSetIterator
public UciSequenceDataSetIterator(int batchSize)
用指定的小批量创建训练集的迭代器。RNG种子123随机化
- 参数 batchSize 小批量大小
LFWDataSetIterator (LFW数据集是为了研究 非限制环境下的人脸识别问题而建立。这个集合包含超过13,000张人脸图像(全部来自于internet,而不是实验室环境))
LFW 迭代器 - 来自非限制环境中的标注人脸
查看 http://vis-www.cs.umass.edu/lfw/
总计13233图片,5749 个分类。
LFWDataSetIterator
public LFWDataSetIterator(int batchSize, int numExamples, int[] imgDim, int numLabels, boolean useSubset,
PathLabelGenerator labelGenerator, boolean train, double splitTrainTest,
ImageTransform imageTransform, Random rng)
创建 LFW 数据特有迭代器
参数 batchSize 示例的批量大小
参数 numExamples 示例总数
参数 imgDim 高度、宽度和通道的数组
参数 numLabels 示例总数
参数 useSubset 使用LFW数据集的一个子集
参数 labelGenerator 路径标注生成器使用
参数 train 如果使用训练值则为true
参数 splitTrainTest 为将要测试的训练和保留分割数据的百分比
参数 imageTransform 如何转换图片
参数 rng 批量洗牌中的要锁定的随机数
MnistDataSetIterator (手写数字数据集迭代器)
MNIST 数据集迭代器 - 60000 个训练样本,10000个测试样本, 10 个分类。数字有 28x28 像素与一个通道 (灰度)。
更多详情查看 http://yann.lecun.com/exdb/mnist/
IrisDataSetIterator (鸢尾花卉数据集迭代器)
IrisDataSetIterator: 一个众所周知的Iris数据集的迭代器。4个特征,3个标签类
https://archive.ics.uci.edu/ml/datasets/Iris
IrisDataSetIterator
public IrisDataSetIterator()
next
public DataSet next()
IrisDataSetIterator 处理遍历Iris数据集。
参数 batch 批量大小
参数 numExamples 示例的总数
TinyImageNetDataSetIterator
Tiny ImageNet是ImageNet数据库的子集。TinyImageNet是斯坦福大学CS321N的默认课程挑战。
Tiny ImageNet有200个分类,每个分类由500个训练图像组成。
图像是64×64像素,RGB。
查看: http://cs231n.stanford.edu/ 和 https://tiny-imagenet.herokuapp.com/
TinyImageNetDataSetIterator
public TinyImageNetDataSetIterator(int batchSize)
用随机迭代顺序(RNG种子固定到123)创建训练集的迭代器
- 参数 batchSize 迭代器小批次大小
SequenceRecordReaderDataSetIterator
序列记录读取器数据集迭代器。
给定一个记录读取器(和可选的另一个用于标签的记录读取器)生成时间序列(序列)数据集。
支持一对多和多对一类型数据加载的填充(即,具有不同数量的输入vs)。
SequenceRecordReaderDataSetIterator
public SequenceRecordReaderDataSetIterator(SequenceRecordReader featuresReader, SequenceRecordReader labels,
int miniBatchSize, int numPossibleLabels)
构造函数,其中特征和标签来自不同的RecordReader(例如,不同的文件),标签用于分类。
- 参数 featuresReader 特征SequenceRecordReader
- 参数 labels 标签: 假设每个时间步的单个值,其中值是0到NoMaulabeleBels-1范围内的整数。
- 参数 miniBatchSize 每次调用next()的小批次大小
- 参数 numPossibleLabels 标签的分类数
hasNext
public boolean hasNext()
是否有下一条数据。
loadFromMetaData
public DataSet loadFromMetaData(RecordMetaData recordMetaData) throws IOException
使用所提供的RecordMetaData将单个序列示例加载到数据集。请注意,一次加载多个实例更为有效率。使用 {- link #loadFromMetaData(List)}
- 参数 recordMetaData 从中加载的记录元数据。应该由给定的记录读取器产生。
- 使用指定的示例返回DataSet
- 加载数据时如果发生错误则抛出IOException
loadFromMetaData
public DataSet loadFromMetaData(List<RecordMetaData> list) throws IOException
使用所提供的RecordMetaData实例加载多个序列示例到数据集。
- 参数 list从中加载的RecordMetaData实例列表。应该是由提供给SequenceRecordReaderDataSetIterator 构造器的记录读取器产生。
- 用指定的示例返回DataSet
- 加载数据时如果发生错误则抛出IOException
RecordReaderMultiDataSetIterator (记录读取器多数据集迭代器)
思想:从一个或多个序列/记录读取器产生多个输入和多个输出。输入和输出可以从RecordReader和SequenceRecordReaders列的子集获得(例如,一些输入和输出作为相同记录/序列中的不同列);还可以混合不同类型的数据(例如,在同一个RecordReaderMultiDataSetIterator使用RecordReader和SequenceRecordReaders)。
输入和子集。
RecordReaderMultiDataSetIterator
public RecordReaderMultiDataSetIterator build()
当处理不同长度的时间序列数据时,我们应该如何对齐输入/标签时间序列?对于等长度:使用EQUAL_LENGTH进行序列分类:使用ALIGN_END
loadFromMetaData
public MultiDataSet loadFromMetaData(RecordMetaData recordMetaData) throws IOException
使用所提供的RecordMetaData将单个序列示例加载到数据集。请注意,一次加载多个实例更为有效率。使用 {- link #loadFromMetaData(List)}
- 参数 recordMetaData 从中加载的记录元数据。应该由给定的记录读取器产生。
- 使用指定的示例返回DataSet
- 加载数据时如果发生错误则抛出IOException
loadFromMetaData
public MultiDataSet loadFromMetaData(List<RecordMetaData> list) throws IOException
使用所提供的RecordMetaData实例加载多个序列示例到数据集。
- 参数 list从中加载的RecordMetaData实例列表。应该是由提供给SequenceRecordReaderDataSetIterator 构造器的记录读取器产生。
- 用指定的示例返回DataSet
- 加载数据时如果发生错误则抛出IOException
RecordReaderDataSetIterator
DataSet对象以及从各个记录生成小批量。
示例 1: 图像分类, 批量大小32, 10 个分类
rr.initialize(new FileSplit(new File("/path/to/directory")));
DataSetIterator iter = new RecordReaderDataSetIterator.Builder(rr, 32)
//Label index (first arg): Always value 1 when using ImageRecordReader. For CSV etc: use index of the column
// that contains the label (should contain an integer value, 0 to nClasses-1 inclusive). Column indexes start
// at 0\. Number of classes (second arg): 标签分类的数量(即10 个用于 MNIST - 10 个用于数字)
.classification(1, nClasses)
.preProcessor(new ImagePreProcessingScaler()) //用于把图片值从0-255归一化到0-1
.build()
}
示例 2: 来自CSV的多输出回归, 批量大小 128
rr.initialize(new FileSplit(new File("/path/to/myCsv.txt")));
DataSetIterator iter = new RecordReaderDataSetIterator.Builder(rr, 128)
//指定回归 标签/目标出现的列。注意所有其它列都被当作特征。列索引从0开始。
.regression(labelColFrom, labelColTo)
.build()
}
RecordReaderDataSetIterator
public RecordReaderDataSetIterator(RecordReader recordReader, int batchSize)
分类构造器:
(a) 标签索引被假定为最后一个可写/列,并且
(b) 从 RecordReader.getLabels()中推断类的数目
注意,如果RecordReader.getLabels()返回NULL,则不会产生输出标签。
- 参数 recordReader 作为数据源的记录读取器
- 参数 batchSize用于每次 .next() 调用的小批次大小
setCollectMetaData
public RecordReaderDataSetIterator(RecordReader recordReader, int batchSize, int labelIndex,int numPossibleLabels)
分类的主要构造器。这将将输入类索引(在位置labelIndex中,整数值0到numPossibleLabels-1包含)转换为适当的one-hot输出/标签表示。
- 参数 recordReader 记录读取器: 提供数据源
- 参数 batchSize 批量大小 (示例数量) 用于输出数据集对象
- 参数 labelIndex 标签 Writable (通常是一个 IntWritable)的索引, 由recordReader.next()获得
- 参数 numPossibleLabels 分类的数量(可能的标签)
loadFromMetaData
public DataSet loadFromMetaData(RecordMetaData recordMetaData) throws IOException
使用提供的RealDataMeta将单个示例加载到DataSet。请注意,同时加载多个实例更为有效。使用 {- link #loadFromMetaData(List)}
- 参数 recordMetaData 用于加载的 RecordMetaData。应该由给定的记录读取器产生
- 返回指定示例的 DataSet
- 如果加载数据期间发生错误则抛出 IOException
loadFromMetaData
public DataSet loadFromMetaData(List<RecordMetaData> list) throws IOException
使用提供的RealDataMeta实例将多个示例加载到数据集。
- 参数 list 是用于加载的RecordMetaData 实例列表。应该是由提供给ReadReadReadDeader的构造函数的记录读取器生成的
- 返回指定示例的 DataSet
- 如果加载数据期间发生错误则抛出 IOException
writableConverter
public Builder writableConverter(WritableConverter converter)
RecordReaderDataSetIterator 的构建类
maxNumBatches
public Builder maxNumBatches(int maxNumBatches)
可选参数,通常不使用。如果设置,则可以用来限制将返回的小批量的最大值(在重置之间)。如果没有设置,将总是返回尽可能多的小批量,因为有可用的数据。
- 参数 maxNumBatches 每个epoch / 重置的小批量的最大数值
regression
public Builder regression(int labelIndex)
将其用于单输出回归(即,1输出/回归目标)
- 参数 labelIndex 包含回归目标的列索引(索引从0开始)
regression
public Builder regression(int labelIndexFrom, int labelIndexTo)
将其用于多个输出回归(1个或更多的输出/回归目标)。请注意,所有回归目标必须是连续的(即,位置x到y,没有间隙)。
- 参数 labelIndexFrom 第一个回归目标的列索引(索引开始于0)
- 参数 labelIndexTo 最后一个回归目标的列索引(包括)
classification
public Builder classification(int labelIndex, int numClasses)
这个用于分类
- 参数 labelIndex 标签索引。列(从0开始索引)是一个整数的值,而且包括0 到 numClasses-1 的值
- 参数 numClasses 标签类别数量 (即数据集中的类别/类数)
preProcessor
public Builder preProcessor(DataSetPreProcessor preProcessor)
可选的参数。允许设置预处理器
- 参数 preProcessor 是要使用的预处理器
collectMetaData
public Builder collectMetaData(boolean collectMetaData)
当设置为true时:当前示例的元数据将出现在返回的数据集中。默认情况下禁用。
- 参数 collectMetaData 是否应该收集元数据
WorkspacesShieldDataSetIterator
这个迭代器分离/迁移来自支持DataSetIterator的数据集,从而提供“安全”数据集。
这通常用于调试和测试目的,一般不应该由用户使用。
WorkspacesShieldDataSetIterator
public WorkspacesShieldDataSetIterator(@NonNull DataSetIterator iterator)
- 参数 iterator 用于分离值的底层迭代器
ExistingDataSetIterator
ExistingDataSetIterator
public ExistingDataSetIterator(@NonNull Iterator<DataSet> iterator)
注意,在使用此构造函数时,不支持重置。
- 参数 iterator 用于包装的迭代器
next
public DataSet next(int num)
注意,在使用此构造函数时,不支持重置。
参数 iterator 用于包装的迭代器
参数 labels 字符串标签。可能为空。
CombinedMultiDataSetPreProcessor
组合构建器中按指定的顺序应用的各种多数据集预处理器。
CombinedMultiDataSetPreProcessor
public Builder addPreProcessor(@NonNull MultiDataSetPreProcessor preProcessor)
- 参数 preProcessor 要添加到要应用的预处理器列表中的预处理器
DataSetFetcher
用于将数据集加载到内存中的低级接口。
这是由DataSetIterator程序用来处理内存中加载数据的细节。
AsyncDataSetIterator
用于DataSetIterator实现的异步预获取迭代器包装器。这将异步地从基础迭代器中预获取指定数量的小批量。
还可以选择(默认情况下对大多数构造函数启用)使用循环工作间,以避免创建具有堆外内存的INDArrays,这些内存需要由JVM垃圾收集器清理。
注意,适当的DL4J fit方法会自动使用这个迭代器,因此用户在拟合网络时不需要手动包装迭代器。
AsyncDataSetIterator
public AsyncDataSetIterator(DataSetIterator baseIterator)
创建一个默认队列大小为8的异步迭代器
- 参数 baseIterator 底层迭代器用于异步方式包装和获取
next
public DataSet next(int num)
创建一个默认队列大小为8的异步迭代器
参数 baseIterator 底层迭代器用于异步方式包装和获取
参数 queue 队列大小
inputColumns
public int inputColumns()
数据集的输入列
- return
totalOutcomes
public int totalOutcomes()
数据集的标签数量
- return
resetSupported
public boolean resetSupported()
这个DataSetIterator支持重置吗?许多DataSetIterator支持重置,但有些不支持。
- 如果支持重置方法,返回true;否则为false
asyncSupported
public boolean asyncSupported()
这个DataSetIterator是否支持异步预取多个DataSet对象?大多数DataSetIterator都可以,但是在某些情况下,将此迭代器包装到执行异步预取的迭代器中可能没有意义。例如,对于以下类型的迭代器使用异步预取是没有意义的:(a)已经将它们的全部内容存储在内存中的迭代器(b)重复使用特性/标签数组的迭代器(因为将来的next()调用将覆盖过去的内容)(c)已经实现某种级别的异步预取的迭代器(d)返回不同的数据的迭代器,取决于何时调用next()方法。
- 如果来自此迭代器的异步预取是可用的则返回true;如果异步预取不应用于此迭代器,则返回false
reset
public void reset()
将迭代器重置为开始。
shutdown
public void shutdown()
我们希望确保,后台线程将具有相同的线程->设备类似,作为主线程。
batch
public int batch()
批量大小
- return
setPreProcessor
public void setPreProcessor(DataSetPreProcessor preProcessor)
设置预处理器
- 参数 preProcessor 要设置的预处理器
getPreProcessor
public DataSetPreProcessor getPreProcessor()
返回预处理器,如果定义
- return
hasNext
public boolean hasNext()
如果迭代器具有更多元素,则返回true。(换句话说,如果下一个元素返回元素而不是抛出异常,则返回true)。
- 如果迭代器具有更多元素,则返回true
next
public DataSet next()
返回迭代中的下一个元素。
- 返回迭代中的下一个元素
remove
public void remove()
从基础集合中移除由迭代器返回的最后一个元素(可选操作)。在每次调用next后,这个方法只能被调用一次。在除了此方法之外的任何方法迭代过程中,如果底层集合被修改,则迭代器的行为将不被指定。
- 抛出 UnsupportedOperationException 如果remove操作不被这个迭代器支持
- 抛出 IllegalStateException 如果next方法如果没有被调用,或remove在最后一次调用next方法之后已经被调用。
- implSpec 默认的实现抛出一个UnsupportedOperationException实例然后不执行任何操作。
FileSplitDataSetIterator
与文件列表一起工作的简单的迭代器。文件到DataSet转换将通过提供的FileCallback实现来处理。
FileSplitDataSetIterator
public FileSplitDataSetIterator(@NonNull List<File> files, @NonNull FileCallback callback)
- 参数 files 用于迭代的文件列表
- 参数 callback 加载文件的回调
AsyncShieldMultiDataSetIterator
此包装器使用现有的MultiDataSetIterator实现,并防止异步预取。
next
public MultiDataSet next(int num)
获取下“Num”个示例。类似于next方法,但返回指定数量的示例。
- 参数 num 获取示例数量
setPreProcessor
public void setPreProcessor(MultiDataSetPreProcessor preProcessor)
在每个MultiDataSet返回之前,将预处理器设置到每个MultiDataSet。
- 参数 preProcessor MultiDataSet的预处理器,可以为空。
resetSupported
public boolean resetSupported()
这个DataSetIterator支持重置吗?许多DataSetIterator支持重置,但有些不支持。
- 如果支持重置方法,返回true;否则为false
asyncSupported
public boolean asyncSupported()
这个DataSetIterator是否支持异步预取多个DataSet对象?
请注意:这个迭代器总是返回false
- 如果来自此迭代器的异步预取是支持的返回true;如果异步预取不应用于此迭代器,则返回false
reset
public void reset()
将迭代器重置为开始状态。
hasNext
public boolean hasNext()
如果迭代器具有更多元素,则返回true。(换句话说,如果下一个元素返回元素而不是抛出异常,则返回true)。
- 如果迭代器具有更多元素,则返回true
next
public MultiDataSet next()
在迭代中返回下一个元素
- 在迭代中返回下一个元素
remove
public void remove()
从基础集合中移除由迭代器返回的最后一个元素(可选操作)。在每次调用next后,这个方法只能被调用一次。在除了此方法之外的任何方法迭代过程中,如果底层集合被修改,则迭代器的行为将不被指定。
- 抛出 UnsupportedOperationException 如果remove操作不被这个迭代器支持
- 抛出 IllegalStateException 如果next方法如果没有被调用,或remove在最后一次调用next方法之后已经被调用。
- implSpec 默认的实现抛出一个UnsupportedOperationException实例然后不执行任何操作。
DataSetIteratorSplitter
这个迭代器实际上将给定的MultiDataSetIterator分割成训练和测试部分。也就是说,你有100000个例子。你的批量大小是32。这意味着你有3125个总批次。分割比例为0.7,这将给你2187个训练批次,和938个测试批次。
请注意:你不能一行中使用测试迭代器两次。训练迭代器应该在测试迭代器使用之前被使用。
请注意:如果底层迭代器使用epoch间的随机化/洗牌,则不能使用此迭代器。
DataSetIteratorSplitter
public DataSetIteratorSplitter(@NonNull DataSetIterator baseIterator, long totalBatches, double ratio)
[图片上传失败...(image-114d85-1542371094657)]
惟一的构造器
- 参数 baseIterator - 要被包装和分割的迭代器
- 参数 totalBatches - 基础迭代器中的总批次
- 参数 ratio -训练/测试 分割比例
getTrainIterator
public DataSetIterator getTrainIterator()
此方法返回训练迭代器实例。
- return
next
public DataSet next(int i)
此方法返回测试迭代器实例。
- return
IteratorMultiDataSetIterator
按要求获取指定批次大小。
通常用于Spark训练,但可用于其他地方。注意:这里不支持重置方法。
EarlyTerminationMultiDataSetIterator
建立一个迭代器,一旦小批量.next()返回的数量等于指定的数目这个迭代器即会终止。
注意,对.next(num)的调用被计数为返回小批量的调用,而不管num的值如何。这实际上将数据限制为这个小批量的指定数量。
EarlyTerminationMultiDataSetIterator
public EarlyTerminationMultiDataSetIterator(MultiDataSetIterator underlyingIterator, int terminationPoint)
构造函数采用迭代器进行包装,然后对hasNext()调用后返回false时的小批量。
- 参数 underlyingIterator, 进行包装的迭代器
- 参数 terminationPoint, 在hasNext()被调用后会返回false时的小批量
翻译:风一样的男子
如果您觉得我的文章给了您帮助,请为我买一杯饮料吧!以下是我的支付宝,意思一下我将非常感激!