Tensorflow对自定义图像数据的ResNet

时间:2018-04-19 19:33:08

标签: tensorflow resnet

我试图在我拥有的自定义图像数据集上运行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上的第一个问题,正如我所说,我对问题领域的许多事情都很陌生,所以请原谅任何新手的错误。

1 个答案:

答案 0 :(得分:0)

回答我自己的问题,代码存在两个不同的问题。

首先,由于网络和图像的大小,机器没有足够的内存来运行代码。一种解决方法是使用具有更多内存的机器,这可以解决第一个问题。但是,由于增加内存并不总是一种选择,我后来发现我可以通过增加第一个卷积层的大小或步幅来减少内存消耗。这对于在GPU上运行ResNet特别有用,GPU通常受内存限制。

其次,网络输出的大小与标签矢量的大小(预期大小)之间存在不匹配。这是因为输入大小的变化。网络通过其污染层和汇集层对输入进行下采样。问题是网络没有为预期的输出大小下采样输入。更改网络超参数中的图层大小解决了这个问题。

要回答这个简短的问题,要在自定义数据集上运行代码,我必须更改问题中的变量(_HEIGHT,_WIDTH等)以及代码中模型定义中图层的大小。