我想从 vgg19 的 pool5 层中提取特征。我为此使用 tf-slim 库。我收到一个非常奇怪的错误说
TypeError: Cannot create initializer for non-floating point type.
我的图像是 dtype=uint8 的 ndarrays。因此,为了解决此错误,我将图像更改为使用 tf.to_float(images)
. 但现在它抱怨我的 gpu 内存不足,这很奇怪。因为我有一个带有 11gb vram 的 nvidia GeForce GTX 1080 Ti,并且没有其他进程在上面运行。批量大小仅为 2000 张图像。在切换到 tf-slim 之前,我使用的是 caffe,这个批量大小根本不是问题。我的代码是这样的:
with slim.arg_scope(vgg.vgg_arg_scope()):
_, end_points = vgg.vgg_19(tf.to_float(images), num_classes=1000,is_training=False)
init_fn = slim.assign_from_checkpoint_fn(
os.path.join(checkpoints_dir, 'vgg_19.ckpt'),
slim.get_model_variables('vgg_19'))
features = end_points['vgg_19/pool5']
所以正如你在上面看到的,我只是想从预训练的权重中提取 pool5 层的特征。那么这里的问题是什么?转换为浮动有问题吗?正如我之前所说,我为此使用了 caffe,我什至能够从 20,000 张图像中提取特征,而这里只有 2000 张。特别是错误说:
ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[2000,224,224,64]
[[Node: vgg_19/conv1/conv1_1/convolution = Conv2D[T=DT_FLOAT, data_format="NHWC", padding="SAME", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true, _device="/job:localhost/replica:0/task:0/gpu:0"](ToFloat, vgg_19/conv1/conv1_1/weights/read)]]
[[Node: vgg_19/pool5/MaxPool/_77 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_154_vgg_19/pool5/MaxPool", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"]()]]
注:图像变量的形状为 [2000,224,224,3]
谢谢