使用以下代码训练我的网络时:
classifier = tf.estimator.Estimator(
model_fn=my_neural_network_model,
model_dir=some_path_to_save_checkpoints,
params={
some_parameters
}
)
classifier.train(input_fn=data_train_estimator, steps=step_num)
Run Code Online (Sandbox Code Playgroud)
其中data_train_estimator定义为:
def data_train_estimator():
dataset = tf.data.TextLineDataset(train_csv_file).map(_parse_csv_train)
dataset = dataset.batch(100)
dataset = dataset.shuffle(1000)
dataset = dataset.repeat()
iterator = dataset.make_one_shot_iterator()
feature, label = iterator.get_next()
return feature, label
Run Code Online (Sandbox Code Playgroud)
dataset.shuffle(1000)实际上如何工作?
进一步来说,
假设我有20000张图像,批量大小= 100,随机缓冲区大小= 1000,我训练模型5000步.
1.对于每1000个步骤,我使用10个批次(大小为100),每个批次独立地从洗牌缓冲区中的相同1000个图像中取出?
2.1 shuffle缓冲区是否像移动窗口一样工作?
2.2或者,它是否从5000张图片中随机挑选1000张(有或没有替换)?
3.在整个5000步中,有多少个不同的状态都有shuffle缓冲区?
我正在尝试进行不同类型的(图像)数据增强来训练我的神经网络。
我知道 tf.image 提供了一些增强功能,但是它们太简单了——例如,我只能将图像旋转 90 度,而不是任意度数。
我也知道 tf.keras.preprocessing.image 提供随机旋转、随机剪切、随机移位和随机缩放。然而,这些方法只能应用于 numpy 数组,而不是张量。
我知道我可以先读取图像,使用 tf.keras.preprocessing.image 中的函数进行增强,然后将这些增强的 numpy 数组转换为张量。
但是,我只是想知道是否有一种方法可以实现张量增强,这样我就不需要为“图像文件 -> 张量 -> numpy 数组 -> 张量”过程而烦恼。
为那些想知道如何应用您的转换的人更新:
有关详细的源代码,您可能需要查看tf.contrib.image.transform和tf.contrib.image.matrices_to_flat_transforms。
这是我的代码:
def transformImg(imgIn,forward_transform):
t = tf.contrib.image.matrices_to_flat_transforms(tf.linalg.inv(forward_transform))
# please notice that forward_transform must be a float matrix,
# e.g. [[2.0,0,0],[0,1.0,0],[0,0,1]] will work
# but [[2,0,0],[0,1,0],[0,0,1]] will not
imgOut = tf.contrib.image.transform(imgIn, t, interpolation="BILINEAR",name=None)
return imgOut
Run Code Online (Sandbox Code Playgroud)
基本上,上面的代码正在做
甲剪切变换平行于x轴,例如,是
因此,我们可以像这样实现剪切变换(使用transformImg()
上面定义的):
def shear_transform_example(filename,shear_lambda):
image_string = tf.read_file(filename) …
Run Code Online (Sandbox Code Playgroud) 我在 ubuntu 16.04 上运行我的神经网络,有 1 个 GPU (GTX 1070) 和 4 个 CPU。
我的数据集包含大约 35,000 张图像,但数据集并不平衡:0 类占 90%,1、2、3、4 类共享其他 10%。因此,我通过使用dataset.repeat(class_weight)
[我也使用一个函数来应用随机增强] 对1-4 类进行过采样,然后使用concatenate
它们。
重采样策略为:
1) 一开始,class_weight[n]
将设置为一个较大的数字,以便每个类将具有与类 0 相同的图像数量。
2) 随着训练的进行,epoch 数增加,权重会根据 epoch 数下降,从而使分布变得更接近实际分布。
因为我class_weight
会随着时代的变化而变化,所以我不能在一开始就打乱整个数据集。相反,我必须逐个类接收数据,并在连接每个类的过采样数据后对整个数据集进行混洗。而且,为了实现平衡的批次,我必须按元素对整个数据集进行洗牌。
以下是我的代码的一部分。
def my_estimator_func():
d0 = tf.data.TextLineDataset(train_csv_0).map(_parse_csv_train)
d1 = tf.data.TextLineDataset(train_csv_1).map(_parse_csv_train)
d2 = tf.data.TextLineDataset(train_csv_2).map(_parse_csv_train)
d3 = tf.data.TextLineDataset(train_csv_3).map(_parse_csv_train)
d4 = tf.data.TextLineDataset(train_csv_4).map(_parse_csv_train)
d1 = d1.repeat(class_weight[1])
d2 = d2.repeat(class_weight[2])
d3 = d3.repeat(class_weight[3])
d4 = d4.repeat(class_weight[4])
dataset = d0.concatenate(d1).concatenate(d2).concatenate(d3).concatenate(d4)
dataset = dataset.shuffle(180000) # <- This …
Run Code Online (Sandbox Code Playgroud) 今天我正在测试一些tensorflow(python)代码。这是著名的MNIST装置上的神经网络。
一切工作正常,因此我只是通读了代码并研究了该网络的结构。
当涉及到图像输入时,我发现以下代码:
image_string = tf.read_file(filename)
image_decoded = tf.image.decode_jpeg(image_string, channels=3)
Run Code Online (Sandbox Code Playgroud)
该代码使用的是“ decode_jpeg”而不是“ decode_png”。而且我没有看到任何错误。
但是,我100%确定图片为PNG格式。
我用过
od -c -b 1.png
Run Code Online (Sandbox Code Playgroud)
查看这些图像,它们就是PNG。
那么,为什么“ decode_jpeg”可以在PNG上工作?并且是否有由此引起的潜在问题?
我是android开发的新手,并且正在按照一些教程进行练习。
我注意到在一些教程中,当他们创建一个新项目时,总是有一个“ Include C ++ support”选项。就像这张图片:
但是,当涉及到Android Studio 3.3(这是最新版本,我昨天才安装了它)时,我只是找不到它。Android studio 3.3如下所示:
我曾尝试用Google搜索类似“ android studio 3.3包括C ++支持”之类的内容,但未能获得答案。
那么,那个选项在哪里呢?他们放弃了吗?
顺便说一下,我正在Linux(Ubuntu16.04)上进行开发,而我发现的大多数教程都在Windows上。这可能是原因吗?