【发布时间】:2018-09-30 10:03:23
【问题描述】:
我正在尝试在我拥有的自定义图像数据集上运行 Tensorflow 的 ResNet implementation。我之前没有使用 Tensorflow 和神经/卷积网络的经验,所以这对我来说也是一次学习经历。
有两个实现示例,一个用于 CIFAR10 数据集,另一个用于 ImageNet 数据集。我选择使用 CIFAR10 的示例作为基线,因为它似乎更容易上手,而且我已经熟悉 CIFAR10 数据集。我按照可用的 README 文件在 CIFAR10 数据集上运行它,并设法切换数据并相对轻松地为我自己的 32x32 图像数据集运行它。
问题是,我的原始数据集包含 512x512 图像,我想以这个原始大小运行它。我将数据集转换为 cifar10 的二进制格式(保持 512x512 大小)并调整实现以尝试运行它。即,我更改了文件路径和文件名,并更改了大小常量以反映数据集:
_HEIGHT = 512
_WIDTH = 512
_NUM_CHANNELS = 3
_DEFAULT_IMAGE_BYTES = _HEIGHT * _WIDTH * _NUM_CHANNELS
_RECORD_BYTES = _DEFAULT_IMAGE_BYTES + 1
_NUM_CLASSES = 5
_NUM_DATA_FILES = 10
_NUM_IMAGES = {
'train': 1000,
'validation': 200,
}
但是,当我尝试运行时出现了一些问题。如果我尝试按原样运行它,我会收到以下错误的内存分配错误:
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
我的数据集包含超过 1200 张图像,但如果我尝试一次全部使用它们,我的计算机内存不足并崩溃(我目前正在设置一个资源更丰富的计算机来解决这个问题)。因此,我想知道这是否仍然意味着我没有足够的内存来运行具有 512x512 图像的代码。我看到tensorflow使用batch_size参数来决定缓冲多少图像
dataset = dataset.prefetch(buffer_size=batch_size)
所以我也尝试减小批量大小,以查看在为图像缓冲区分配内存时是否存在问题。直到我获得低至 16 张图像的批次时才会出现相同的错误。但是,对于 8 张图片,此问题不再出现,而是收到一条不同的错误消息:
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
Traceback (most recent call last):
File "path-to/venv/lib/python3.4/site-packages/tensorflow/python/client/session.py", line 1327, in _do_call
return fn(*args)
File "path-to/venv/lib/python3.4/site-packages/tensorflow/python/client/session.py", line 1312, in _run_fn
options, feed_dict, fetch_list, target_list, run_metadata)
File "path-to/venv/lib/python3.4/site-packages/tensorflow/python/client/session.py", line 1420, in _call_tf_sessionrun
status, run_metadata)
File "path-to/venv/lib/python3.4/site-packages/tensorflow/python/framework/errors_impl.py", line 516, in __exit__
c_api.TF_GetCode(self.status.status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: logits and labels must be same size: logits_size=[117128,5] labels_size=[8,5]
[[Node: softmax_cross_entropy_loss/xentropy = SoftmaxCrossEntropyWithLogits[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"](softmax_cross_entropy_loss/xentropy/Reshape, softmax_cross_entropy_loss/xentropy/Reshape_1)]]
数据集大小和标签数组之间似乎不匹配,但只有当我尝试在 512x512 图像上运行它时才会出现该问题,它适用于 32x32 图像上的任何批量大小。
最后,我的问题是,我是否必须更改一些其他参数或进行其他调整才能在我的 512x512 数据集上运行 ResNet CIFAR10 代码?这些错误是否与我做错的事情有关,或者我可能需要解决两件事?任何有关导致这些错误的原因的见解也会有很大帮助。
简而言之,将我自己的 512x512 数据集输入到 TensorFlow 的 ResNet CIFAR10 实现中需要进行哪些更改?
这是我在 StackOverflow 上的第一个问题,正如我所说,我对这个问题领域的许多事情都很陌生,所以请原谅任何新手错误。
【问题讨论】:
标签: tensorflow resnet