Tensorflow中的超参数优化

3
我正在使用 TensorFlow 中的贝叶斯优化来进行卷积神经网络 (CNN) 的超参数优化。但是我遇到了以下错误:

ResourceExhaustedError(参见上面的 traceback):在分配具有形状 [4136,1,180,432] 和类型 float 的张量时,GPU_0_bfc 分配器在 /job:localhost/replica:0/task:0/device:GPU:0 上发生 OOM 错误。

我优化了这些超参数:
dim_batch_size = Integer(low=1, high=50, name='batch_size')
dim_kernel_size1 = Integer(low=1, high=75, name='kernel_size1')
dim_kernel_size2 = Integer(low=1, high=50, name='kernel_size2')
dim_depth = Integer(low=1, high=100, name='depth')
dim_num_hidden = Integer(low=5, high=1500, name='num_hidden')
dim_num_dense_layers = Integer(low=1, high=5, name='num_dense_layers')
dim_learning_rate = Real(low=1e-6, high=1e-2, prior='log-uniform',
                         name='learning_rate')
dim_activation = Categorical(categories=['relu', 'sigmoid'],
                             name='activation')
dim_max_pool = Integer(low=1, high=100, name='max_pool')

dimensions = [dim_batch_size,
              dim_kernel_size1,
              dim_kernel_size2,
              dim_depth,
              dim_num_hidden,
              dim_num_dense_layers,
              dim_learning_rate,
              dim_activation,
              dim_max_pool]

它说资源已经耗尽了。为什么会这样呢?

是因为我优化了太多的超参数吗?还是存在一些维度不匹配的问题?或者我分配的超参数范围超出了正确操作的允许范围?


抱歉,我没有回答你的问题,但我想知道你是否介意分享你的完整代码。我正在尝试做同样的事情,但是想要跟随已经完成的工作 https://github.com/Vooban/Hyperopt-Keras-CNN-CIFAR-100/blob/master/neural_net.py ,但我很想看到其他的例子。 - MikeDoho
@MikeDoho,你成功让Hyperopt工作了吗? - Suleka_28
@Suleka_28 我确实需要帮助!如果你是想要帮忙,那么谢谢你!如果你和我一样需要另一个例子,那就告诉我吧。 - MikeDoho
1个回答

3
当多个超参数处于高端范围时,模型会变得过大,从而导致OOM错误。例如,假设批量大小约为50dim_num_hidden约为1500等等。超参数的数量并不重要,只有其中几个就足以使模型崩溃。
错误消息中的具体张量为[4136,1,180,432],如果使用32位浮点数进行参数计算,则为1.2Gb。这很多,并且仅是进行NN训练所需的众多张量之一(例如,前向和后向双倍参数数量,因此内存也会增加)。难怪TensorFlow会出现OOM错误。
Bayesian优化调参的一个问题是算法很可能选择超空间的角落,即在一个范围内值接近最小值的点和在另一个范围内值接近最大值的点。详情请参见this question。这意味着您必须至少限制一个超参数(通常是批量大小),以便当其他所有内容都达到最大值时,模型仍能适应。或者您可以聪明地在每次迭代运行模型之前精确计算它,但这样算法就无法优化批量大小。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接