什么是迭代器?
数据集迭代器允许将数据轻松加载到神经网络中,并帮助组织批处理、转换和掩码。包含在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);
image.gif
许多其他方法也接受迭代器来完成任务,例如评估:
// 直接传递给神经网络
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); //检查对真实分类的预测
}
image.gif
可用的迭代器
CifarDataSetIterator (CIFAR10数据集迭代器)
CifarDataSetIterator是CIFAR10数据集的迭代器,10个分类,32x32图像 3通道(RGB)还支持用于基于Sergey Zagoruyko示例https://github.com/szagoruyko/cifar.torch 对数据集进行归一化的特殊预处理器。
CifarDataSetIterator
public CifarDataSetIterator(int batchSize, int numExamples)
image.gif
用创建器返回的batchSize与numExamples加载图片。
next
public DataSet next(int batchSize)
image.gif
用创建器返回的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
image.gif
EMNIST 数据集有多个不同的子集。 详见 {- link EmnistDataSetIterator}。
numExamplesTrain
public static int numExamplesTrain(Set dataSet)
image.gif
基于指定的RNG种子创建具有随机混洗数据的EMNIST迭代器
- 参数 dataSet 用于返回的数据集
- 参数 batchSize批量大小
- 参数 train 如果为 true: 使用训练集。 如果 false: 使用测试集
- 参数 seed Random number generator seed
numExamplesTest
public static int numExamplesTest(Set dataSet)
image.gif
获取指定子集的测试示例数。
- 参数 dataSet 获取的子集
- 返回指定子集的示例数
numLabels
public static int numLabels(Set dataSet)
image.gif
获取指定子集的标签数量
- 参数 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)
image.gif
用指定的小批量创建训练集的迭代器。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)
image.gif
创建 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()
image.gif
next
public DataSet next()
image.gif
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)
image.gif
用随机迭代顺序(RNG种子固定到123)创建训练集的迭代器
- 参数 batchSize 迭代器小批次大小
SequenceRecordReaderDataSetIterator
序列记录读取器数据集迭代器。
给定一个记录读取器(和可选的另一个用于标签的记录读取器)生成时间序列(序列)数据集。
支持一对多和多对一类型数据加载的填充(即,具有不同数量的输入vs)。
SequenceRecordReaderDataSetIterator
public SequenceRecordReaderDataSetIterator(SequenceRecordReader featuresReader, SequenceRecordReader labels,
int miniBatchSize, int numPossibleLabels)
image.gif
构造函数,其中特征和标签来自不同的RecordReader(例如,不同的文件),标签用于分类。
- 参数 featuresReader 特征SequenceRecordReader
- 参数 labels 标签: 假设每个时间步的单个值,其中值是0到NoMaulabeleBels-1范围内的整数。
- 参数 miniBatchSize 每次调用next()的小批次大小
- 参数 numPossibleLabels 标签的分类数
hasNext
public boolean hasNext()
image.gif
是否有下一条数据。
loadFromMetaData
public DataSet loadFromMetaData(RecordMetaData recordMetaData) throws IOException
image.gif
使用所提供的RecordMetaData将单个序列示例加载到数据集。请注意,一次加载多个实例更为有效率。使用 {- link #loadFromMetaData(List)}
- 参数 recordMetaData 从中加载的记录元数据。应该由给定的记录读取器产生。
- 使用指定的示例返回DataSet
- 加载数据时如果发生错误则抛出IOException
loadFromMetaData
public DataSet loadFromMetaData(List<RecordMetaData> list) throws IOException
image.gif
使用所提供的RecordMetaData实例加载多个序列示例到数据集。
- 参数 list从中加载的RecordMetaData实例列表。应该是由提供给SequenceRecordReaderDataSetIterator 构造器的记录读取器产生。
- 用指定的示例返回DataSet
- 加载数据时如果发生错误则抛出IOException
RecordReaderMultiDataSetIterator (记录读取器多数据集迭代器)
思想:从一个或多个序列/记录读取器产生多个输入和多个输出。输入和输出可以从RecordReader和SequenceRecordReaders列的子集获得(例如,一些输入和输出作为相同记录/序列中的不同列);还可以混合不同类型的数据(例如,在同一个RecordReaderMultiDataSetIterator使用RecordReader和SequenceRecordReaders)。
输入和子集。
RecordReaderMultiDataSetIterator
public RecordReaderMultiDataSetIterator build()
image.gif
当处理不同长度的时间序列数据时,我们应该如何对齐输入/标签时间序列?对于等长度:使用EQUAL_LENGTH进行序列分类:使用ALIGN_END
loadFromMetaData
public MultiDataSet loadFromMetaData(RecordMetaData recordMetaData) throws IOException
image.gif
使用所提供的RecordMetaData将单个序列示例加载到数据集。请注意,一次加载多个实例更为有效率。使用 {- link #loadFromMetaData(List)}
- 参数 recordMetaData 从中加载的记录元数据。应该由给定的记录读取器产生。
- 使用指定的示例返回DataSet
- 加载数据时如果发生错误则抛出IOException
loadFromMetaData
public MultiDataSet loadFromMetaData(List<RecordMetaData> list) throws IOException
image.gif
使用所提供的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()
}
image.gif
示例 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()
}
image.gif
RecordReaderDataSetIterator
public RecordReaderDataSetIterator(RecordReader recordReader, int batchSize)
image.gif
分类构造器:
(a) 标签索引被假定为最后一个可写/列,并且
(b) 从 RecordReader.getLabels()中推断类的数目
注意,如果RecordReader.getLabels()返回NULL,则不会产生输出标签。
- 参数 recordReader 作为数据源的记录读取器
- 参数 batchSize用于每次 .next() 调用的小批次大小
setCollectMetaData
public RecordReaderDataSetIterator(RecordReader recordReader, int batchSize, int labelIndex,int numPossibleLabels)
image.gif
分类的主要构造器。这将将输入类索引(在位置labelIndex中,整数值0到numPossibleLabels-1包含)转换为适当的one-hot输出/标签表示。
- 参数 recordReader 记录读取器: 提供数据源
- 参数 batchSize 批量大小 (示例数量) 用于输出数据集对象
- 参数 labelIndex 标签 Writable (通常是一个 IntWritable)的索引, 由recordReader.next()获得
- 参数 numPossibleLabels 分类的数量(可能的标签)
loadFromMetaData
public DataSet loadFromMetaData(RecordMetaData recordMetaData) throws IOException
image.gif
使用提供的RealDataMeta将单个示例加载到DataSet。请注意,同时加载多个实例更为有效。使用 {- link #loadFromMetaData(List)}
- 参数 recordMetaData 用于加载的 RecordMetaData。应该由给定的记录读取器产生
- 返回指定示例的 DataSet
- 如果加载数据期间发生错误则抛出 IOException
loadFromMetaData
public DataSet loadFromMetaData(List<RecordMetaData> list) throws IOException
image.gif
使用提供的RealDataMeta实例将多个示例加载到数据集。
- 参数 list 是用于加载的RecordMetaData 实例列表。应该是由提供给ReadReadReadDeader的构造函数的记录读取器生成的
- 返回指定示例的 DataSet
- 如果加载数据期间发生错误则抛出 IOException
writableConverter
public Builder writableConverter(WritableConverter converter)
image.gif
RecordReaderDataSetIterator 的构建类
maxNumBatches
public Builder maxNumBatches(int maxNumBatches)
image.gif
可选参数,通常不使用。如果设置,则可以用来限制将返回的小批量的最大值(在重置之间)。如果没有设置,将总是返回尽可能多的小批量,因为有可用的数据。
- 参数 maxNumBatches 每个epoch / 重置的小批量的最大数值
regression
public Builder regression(int labelIndex)
image.gif
将其用于单输出回归(即,1输出/回归目标)
- 参数 labelIndex 包含回归目标的列索引(索引从0开始)
regression
public Builder regression(int labelIndexFrom, int labelIndexTo)
image.gif
将其用于多个输出回归(1个或更多的输出/回归目标)。请注意,所有回归目标必须是连续的(即,位置x到y,没有间隙)。
- 参数 labelIndexFrom 第一个回归目标的列索引(索引开始于0)
- 参数 labelIndexTo 最后一个回归目标的列索引(包括)
classification
public Builder classification(int labelIndex, int numClasses)
image.gif
这个用于分类
- 参数 labelIndex 标签索引。列(从0开始索引)是一个整数的值,而且包括0 到 numClasses-1 的值
- 参数 numClasses 标签类别数量 (即数据集中的类别/类数)
preProcessor
public Builder preProcessor(DataSetPreProcessor preProcessor)
image.gif
可选的参数。允许设置预处理器
- 参数 preProcessor 是要使用的预处理器
collectMetaData
public Builder collectMetaData(boolean collectMetaData)
image.gif
当设置为true时:当前示例的元数据将出现在返回的数据集中。默认情况下禁用。
- 参数 collectMetaData 是否应该收集元数据
WorkspacesShieldDataSetIterator
这个迭代器分离/迁移来自支持DataSetIterator的数据集,从而提供“安全”数据集。
这通常用于调试和测试目的,一般不应该由用户使用。
WorkspacesShieldDataSetIterator
public WorkspacesShieldDataSetIterator(@NonNull DataSetIterator iterator)
image.gif
- 参数 iterator 用于分离值的底层迭代器
ExistingDataSetIterator
ExistingDataSetIterator
public ExistingDataSetIterator(@NonNull Iterator<DataSet> iterator)
image.gif
注意,在使用此构造函数时,不支持重置。
- 参数 iterator 用于包装的迭代器
next
public DataSet next(int num)
image.gif
注意,在使用此构造函数时,不支持重置。
-
参数 iterator 用于包装的迭代器
-
参数 labels 字符串标签。可能为空。
CombinedMultiDataSetPreProcessor
组合构建器中按指定的顺序应用的各种多数据集预处理器。
CombinedMultiDataSetPreProcessor
public Builder addPreProcessor(@NonNull MultiDataSetPreProcessor preProcessor)
image.gif
- 参数 preProcessor 要添加到要应用的预处理器列表中的预处理器
DataSetFetcher
用于将数据集加载到内存中的低级接口。
这是由DataSetIterator程序用来处理内存中加载数据的细节。
AsyncDataSetIterator
用于DataSetIterator实现的异步预获取迭代器包装器。这将异步地从基础迭代器中预获取指定数量的小批量。
还可以选择(默认情况下对大多数构造函数启用)使用循环工作间,以避免创建具有堆外内存的INDArrays,这些内存需要由JVM垃圾收集器清理。
注意,适当的DL4J fit方法会自动使用这个迭代器,因此用户在拟合网络时不需要手动包装迭代器。
AsyncDataSetIterator
public AsyncDataSetIterator(DataSetIterator baseIterator)
image.gif
创建一个默认队列大小为8的异步迭代器
- 参数 baseIterator 底层迭代器用于异步方式包装和获取
next
public DataSet next(int num)
image.gif
创建一个默认队列大小为8的异步迭代器
-
参数 baseIterator 底层迭代器用于异步方式包装和获取
-
参数 queue 队列大小
inputColumns
public int inputColumns()
image.gif
数据集的输入列
- return
totalOutcomes
public int totalOutcomes()
image.gif
数据集的标签数量
- return
resetSupported
public boolean resetSupported()
image.gif
这个DataSetIterator支持重置吗?许多DataSetIterator支持重置,但有些不支持。
- 如果支持重置方法,返回true;否则为false
asyncSupported
public boolean asyncSupported()
image.gif
这个DataSetIterator是否支持异步预取多个DataSet对象?大多数DataSetIterator都可以,但是在某些情况下,将此迭代器包装到执行异步预取的迭代器中可能没有意义。例如,对于以下类型的迭代器使用异步预取是没有意义的:(a)已经将它们的全部内容存储在内存中的迭代器(b)重复使用特性/标签数组的迭代器(因为将来的next()调用将覆盖过去的内容)(c)已经实现某种级别的异步预取的迭代器(d)返回不同的数据的迭代器,取决于何时调用next()方法。
- 如果来自此迭代器的异步预取是可用的则返回true;如果异步预取不应用于此迭代器,则返回false
reset
public void reset()
image.gif
将迭代器重置为开始。
shutdown
public void shutdown()
image.gif
我们希望确保,后台线程将具有相同的线程->设备类似,作为主线程。
batch
public int batch()
image.gif
批量大小
- return
setPreProcessor
public void setPreProcessor(DataSetPreProcessor preProcessor)
image.gif
设置预处理器
- 参数 preProcessor 要设置的预处理器
getPreProcessor
public DataSetPreProcessor getPreProcessor()
image.gif
返回预处理器,如果定义
- return
hasNext
public boolean hasNext()
image.gif
如果迭代器具有更多元素,则返回true。(换句话说,如果下一个元素返回元素而不是抛出异常,则返回true)。
- 如果迭代器具有更多元素,则返回true
next
public DataSet next()
image.gif
返回迭代中的下一个元素。
- 返回迭代中的下一个元素
remove
public void remove()
image.gif
从基础集合中移除由迭代器返回的最后一个元素(可选操作)。在每次调用next后,这个方法只能被调用一次。在除了此方法之外的任何方法迭代过程中,如果底层集合被修改,则迭代器的行为将不被指定。
- 抛出 UnsupportedOperationException 如果remove操作不被这个迭代器支持
- 抛出 IllegalStateException 如果next方法如果没有被调用,或remove在最后一次调用next方法之后已经被调用。
- implSpec 默认的实现抛出一个UnsupportedOperationException实例然后不执行任何操作。
FileSplitDataSetIterator
与文件列表一起工作的简单的迭代器。文件到DataSet转换将通过提供的FileCallback实现来处理。
FileSplitDataSetIterator
public FileSplitDataSetIterator(@NonNull List<File> files, @NonNull FileCallback callback)
image.gif
- 参数 files 用于迭代的文件列表
- 参数 callback 加载文件的回调
AsyncShieldMultiDataSetIterator
此包装器使用现有的MultiDataSetIterator实现,并防止异步预取。
next
public MultiDataSet next(int num)
image.gif
获取下“Num”个示例。类似于next方法,但返回指定数量的示例。
- 参数 num 获取示例数量
setPreProcessor
public void setPreProcessor(MultiDataSetPreProcessor preProcessor)
image.gif
在每个MultiDataSet返回之前,将预处理器设置到每个MultiDataSet。
- 参数 preProcessor MultiDataSet的预处理器,可以为空。
resetSupported
public boolean resetSupported()
image.gif
这个DataSetIterator支持重置吗?许多DataSetIterator支持重置,但有些不支持。
- 如果支持重置方法,返回true;否则为false
asyncSupported
public boolean asyncSupported()
image.gif
这个DataSetIterator是否支持异步预取多个DataSet对象?
请注意:这个迭代器总是返回false
- 如果来自此迭代器的异步预取是支持的返回true;如果异步预取不应用于此迭代器,则返回false
reset
public void reset()
image.gif
将迭代器重置为开始状态。
hasNext
public boolean hasNext()
image.gif
如果迭代器具有更多元素,则返回true。(换句话说,如果下一个元素返回元素而不是抛出异常,则返回true)。
- 如果迭代器具有更多元素,则返回true
next
public MultiDataSet next()
image.gif
在迭代中返回下一个元素
- 在迭代中返回下一个元素
remove
public void remove()
image.gif
从基础集合中移除由迭代器返回的最后一个元素(可选操作)。在每次调用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()
image.gif
此方法返回训练迭代器实例。
- return
next
public DataSet next(int i)
image.gif
此方法返回测试迭代器实例。
- return
IteratorMultiDataSetIterator
按要求获取指定批次大小。
通常用于Spark训练,但可用于其他地方。注意:这里不支持重置方法。
EarlyTerminationMultiDataSetIterator
建立一个迭代器,一旦小批量.next()返回的数量等于指定的数目这个迭代器即会终止。
注意,对.next(num)的调用被计数为返回小批量的调用,而不管num的值如何。这实际上将数据限制为这个小批量的指定数量。
EarlyTerminationMultiDataSetIterator
public EarlyTerminationMultiDataSetIterator(MultiDataSetIterator underlyingIterator, int terminationPoint)
image.gif
构造函数采用迭代器进行包装,然后对hasNext()调用后返回false时的小批量。
- 参数 underlyingIterator, 进行包装的迭代器
- 参数 terminationPoint, 在hasNext()被调用后会返回false时的小批量
翻译:风一样的男子
image如果您觉得我的文章给了您帮助,请为我买一杯饮料吧!以下是我的支付宝,意思一下我将非常感激!
image
网友评论