我准备了一个数据集来识别某种类型的对象(大约2240个负面对象示例,只有大约90个正面对象示例).但是,在为数据集中的每个对象计算10个要素之后,唯一训练实例的数量分别下降到大约130和30.
由于相同的训练实例实际上代表不同的对象,我可以说这种复制包含相关信息(例如对象特征值的分布),这可能在某种程度上有用吗?
假设我有一个非常小的数据集,只有50个图像.我想重新使用Red Pill教程中的代码,但是在每批训练中将随机变换应用于同一组图像,比如对亮度,对比度等进行随机更改.我只添加了一个函数:
def preprocessImages(x):
retValue = numpy.empty_like(x)
for i in range(50):
image = x[i]
image = tf.reshape(image, [28,28,1])
image = tf.image.random_brightness(image, max_delta=63)
#image = tf.image.random_contrast(image, lower=0.2, upper=1.8)
# Subtract off the mean and divide by the variance of the pixels.
float_image = tf.image.per_image_whitening(image)
float_image_Mat = sess.run(float_image)
retValue[i] = float_image_Mat.reshape((28*28))
return retValue
Run Code Online (Sandbox Code Playgroud)
对旧代码的小改动:
batch = mnist.train.next_batch(50)
for i in range(1000):
#batch = mnist.train.next_batch(50)
if i%100 == 0:
train_accuracy = accuracy.eval(feed_dict={
x:preprocessImages(batch[0]), y_: batch[1], keep_prob: 1.0})
print("step %d, training accuracy …Run Code Online (Sandbox Code Playgroud) 在开发神经网络时,通常将训练数据划分为训练数据集、测试数据集和保留数据集(许多人分别将这些数据集称为训练数据集、验证数据集和测试数据集。相同的东西,不同的名称)。许多人建议根据测试数据集中的性能选择超参数。我的问题是:为什么?为什么不最大化训练数据集中超参数的性能,并在我们通过测试数据集中的性能下降检测到过度拟合时停止训练超参数?由于训练通常大于测试,与测试数据集上的训练超参数相比,这不会产生更好的结果吗?
2016 年 7 月 6 日更新
术语发生变化,以匹配下面的评论。在本文中,数据集现在被称为“训练”、“验证”和“测试” 。我不使用测试数据集进行训练。我正在使用 GA 来优化超参数。在外部 GA 训练过程的每次迭代中,GA 都会选择一个新的超参数集,在训练数据集上进行训练,并在验证和测试数据集上进行评估。GA 调整超参数以最大限度地提高训练数据集中的准确性。当检测到网络过拟合(在验证数据集中)时,迭代内的网络训练将停止,而当检测到超参数过拟合时(再次在验证中),外部 GA 训练过程将停止。结果是针对训练数据集进行了伪优化的超参数。问题是:为什么许多来源(例如https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf,第 B.1 节)建议优化验证集上的超参数,而不是训练集上的超参数?引用 Srivasta、Hinton 等人(上面的链接):“在验证集上调整超参数,以便产生最佳验证错误...... ”
我想在 TensorFlow 中创建移动 MNIST 训练集。我一直在考虑在或 using 中创建tf.ReaderBase和发出tf.Example训练序列的子类,但我不确定这是否是处理它的正确方法,以及它首先是否是一个好主意(关于创建的 CPU 负载)训练期间的序列)。tf.ReaderBase.readtf.QueueBase
我正在训练一个具有多重损失的网络,并且使用生成器创建数据并将数据馈送到我的网络中。
我已经检查了数据的结构,它总体上看起来不错,并且在大多数情况下也几乎按照预期进行了训练,但是在几乎每次随机时期,每个预测的训练损失突然从
# End of epoch 3
loss: 2.8845
Run Code Online (Sandbox Code Playgroud)
到
# Beginning of epoch 4
loss: 1.1921e-07
Run Code Online (Sandbox Code Playgroud)
我认为这可能是数据,但是,据我所知,数据通常很好,而且更加可疑,因为这将发生在随机时期(可能是因为在 SGD 期间选择了随机数据点?)但会持续存在在剩下的训练中。就像在 epoch 3 时,训练损失减少到1.1921e-07那么它将在 epoch 4、epoch 5 等中继续这样。
但是,有时它到达 epoch 5 并且还没有这样做,然后可能会在 epoch 6 或 7 进行。
在数据之外是否有任何可行的原因可能导致这种情况?一些模糊的数据点会导致如此快吗?
谢谢
编辑:
结果:
300/300 [==============================] - 339s - loss: 3.2912 - loss_1: 1.8683 - loss_2: 9.1352 - loss_3: 5.9845 -
val_loss: 1.1921e-07 - val_loss_1: 1.1921e-07 - val_loss_2: 1.1921e-07 - val_loss_3: 1.1921e-07
Run Code Online (Sandbox Code Playgroud)
此后的下一个时期都有训练损失 1.1921e-07
在tesseract 文档中,解释了使用示例文本和字体进行训练的方法.
我使用了jTessBoxEditor,但其工作方式与tesseract培训工具非常相似.
我得到了一些可接受的结果,但我认为最佳解决方案是训练tesseract,无论如何都必须识别实际类型的图像.
由于我只需要识别数字,我可以手工切割每个数字,也许每个数字的许多版本,并用这些图像训练tesseract,甚至手动设置框.
有没有办法做到这一点?
我正在 Tensorflow 上使用 Inception 进行迁移学习,这是我遵循的训练代码:https ://raw.githubusercontent.com/tensorflow/hub/master/examples/image_retraining/retrain.py
在代码的底部,我们可以根据我们的数据集指定参数。(有训练、val、测试百分比和训练、val、测试批量大小)
假设我有一个非常大的数据集(1 百万),并且我已经将 设置training, validation, testing percentage为75:15:10。
但我不知道如何正确设置批处理参数:
现在,我将 设置train_batch_size为 64,是否需要为 设置相同的值validation_batch_size?或者它应该比 更大或更小train_batch_size?
我使用张量流 api (2.0) 加载图像,如下所示:
def load(image_file):
image = tf.io.read_file(image_file)
image = tf.image.decode_jpeg(image)
Run Code Online (Sandbox Code Playgroud)
现在我有了这个对象,我想显示这个图像,我可以简单地使用 matplotlib.pyplot,这很有效。
plt.figure()
plt.imshow(re/255.0)
plt.show()
Run Code Online (Sandbox Code Playgroud)
然而,从一开始就用 OpenCV2 尝试这个是有问题的,大多数示例来自 1.0,基于 .eval() 会话的 numpy 转换建议。一种方法是首先将张量流对象转换为 numpy,这是 API 文档中执行此操作的函数:
TensorFlow
API r2.0
TensorFlow Core 2.0a
Python
tf.make_ndarray
Create a numpy ndarray from a tensor.
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这不起作用,我得到了许多错误,而我只想做一些简单的事情,然后使用一些开放的 cv2 函数,如重新映射、调整大小等:
文件“C:\Python\Python37\lib\site-packages\tensorflow\python\eager\def_function.py”,第 426 行,调用中 self._initialize(args, kwds, add_initializers_to=initializer_map) 文件“C:\Python\Python37\lib\site-packages\tensorflow\python\eager\def_function.py”,第 370 行,在 _initialize *args, **kwds 中) ) 文件“C:\Python\Python37\lib\site-packages\tensorflow\python\eager\function.py”,第 1313 行,在 _get_concrete_function_internal_garbage_collected graph_function, _, _ = self._maybe_define_function(args, kwargs) 文件“C: \Python\Python37\lib\site-packages\tensorflow\python\eager\function.py”,第 1580 行,在 _maybe_define_function graph_function = self._create_graph_function(args, kwargs) …
python training-data python-3.x eager-execution tensorflow2.0
我正在尝试使用 tensorflow==1.13.1 在多个 GPU 上训练Grover 的鉴别器模型。该模型的默认配置假设在多个 TPU 上进行训练,并被证明适用于具有多个 TPU 的系统。然而,由于 TPU 不可用,我试图通过使用 tensorflow 分布策略更改模型的运行配置来将训练分布在多个 GPU 上,如下所示:
dist_strategy = tf.contrib.distribute.MirroredStrategy(
num_gpus=8,
cross_device_ops=AllReduceCrossDeviceOps('nccl', num_packs=8),
# cross_device_ops=AllReduceCrossDeviceOps('hierarchical_copy')
)
Run Code Online (Sandbox Code Playgroud)
然后我尝试更改 GPU 的运行配置,如下所示:
run_config = RunConfig(
train_distribute=dist_strategy,
eval_distribute=dist_strategy,
log_step_count_steps=log_every_n_steps,
model_dir=FLAGS.output_dir,
save_checkpoints_steps=FLAGS.iterations_per_loop)
Run Code Online (Sandbox Code Playgroud)
它似乎正确分配数据(我可以通过 GPU 使用情况和其他指标来判断),但是在收集梯度时它失败并出现以下错误:
ValueError: You must specify an aggregation method to update a MirroredVariable in Replica Context.
Run Code Online (Sandbox Code Playgroud)
但是,我在分发策略中提供了跨设备操作。对我来说,最终的解决方案似乎是使用分布策略代码修改损失函数,但我认为它应该可以与 TPU 一起使用。任何帮助表示高度赞赏!
我按照本教程使用fit_generator()Keras 方法即时生成数据,以训练我的神经网络模型。
我使用keras.utils.Sequence类创建了一个生成器。调用fit_generator()是:
history = model.fit_generator(generator=EVDSSequence(images_train, TRAIN_BATCH_SIZE, INPUT_IMG_DIR, INPUT_JSON_DIR, SPLIT_CHAR, sizeArray, NCHW, shuffle=True),
steps_per_epoch=None, epochs=EPOCHS,
validation_data=EVDSSequence(images_valid, VALID_BATCH_SIZE, INPUT_IMG_DIR, INPUT_JSON_DIR, SPLIT_CHAR, sizeArray, NCHW, shuffle=True),
validation_steps=None,
callbacks=callbacksList, verbose=1,
workers=0, max_queue_size=1, use_multiprocessing=False)
Run Code Online (Sandbox Code Playgroud)
steps_per_epoch是None,因此每个 epoch 的步数由 Keras__len()__方法计算。
正如上面的链接所说:
在这里,该方法
on_epoch_end在每个 epoch 的开始和结束时触发一次。如果shuffle参数设置为True,我们将在每次通过时获得一个新的探索顺序(否则只保留线性探索方案)。
我的问题是该on_epoch_end()方法仅在最开始时被调用,而不会在每个时代结束时被调用。因此,在每个时期,批次顺序始终相同。
我尝试使用np.ceil而不是np.floorin__len__()方法,但没有成功。
你知道为什么on_epoch_end不在每个纪元结束时调用吗?您能告诉我在每个时代结束时(或开始时)调整批次顺序的任何解决方法吗?
非常感谢!
training-data ×10
tensorflow ×5
python ×4
keras ×2
gpu ×1
ocr ×1
on-the-fly ×1
python-3.x ×1
statistics ×1
tesseract ×1