使用 optuna 进行优化时的 TensorFlow / keras 问题

Posted

技术标签:

【中文标题】使用 optuna 进行优化时的 TensorFlow / keras 问题【英文标题】:Tensorflow / keras issue when optimizing with optuna 【发布时间】:2021-06-10 17:09:51 【问题描述】:

我对机器学习还很陌生,我一直在尝试从 sentdex 教程中自学神经网络。我按照他关于使用循环神经网络预测各种加密货币价格的教程进行操作,并在更改 NumPy 数组和一些语法后成功了。现在我一直在尝试对其进行优化,因为我注意到通过调整学习率和网络层数会发生多么剧烈的过度拟合。

没有错误的代码是这个 https://colab.research.google.com/drive/1VNeRLeGBByEIdMVwXcbsOR8xjWwsHHoQ?usp=sharing

看起来我只是复制并粘贴了代码,但这只是因为我正在对代码进行故障排除,我只是将这个代码与我在教程中遵循的代码进行了引用,然后在我开始工作后继续使用这个代码。

我一直在尝试遵循 optuna 的教程和我发现的用于优化在线网络的代码,因此我尝试从这些来源添加它

https://github.com/optuna/optuna/blob/master/examples/tensorflow/tensorflow_eager_simple.py

https://github.com/optuna/optuna/blob/master/examples/keras/keras_integration.py

https://colab.research.google.com/drive/1-tANR7FopTX_ipAUCJmfZ2h_-iu3ljD_?usp=sharing

我想要做的是这个

https://colab.research.google.com/drive/1cgnz7XUwnhfBvsA9whCXKQ3PrRs_sddh?usp=sharing

这是我遇到错误的地方。起初,当我发这篇文章时,我被卡住了

ValueError:形状 (None, 1) 和 (None, 50, 2) 不兼容

但后来我记得在我遵循教程的那一个中,我需要一个没有循环层的循环层 return_sequences=True 在我继续密集层之前

所以我尝试添加另一个循环层而不返回序列,现在我得到了这个

ValueError:lstm_20 层的输入 0 与该层不兼容:预期 ndim=3,发现 ndim=2。收到的完整形状:(无,2)

我不完全确定从这里去哪里。我觉得我只是在做一些愚蠢的事情,一年来我一直在试图弄清楚如何在我自己的图像上使用教程中的卷积神经网络,因为我正在重塑而不是调整图片大小。我希望它是这样简单的。

感谢大家的帮助,自从我开始编程之旅以来,你们一直非常乐于助人。

【问题讨论】:

【参考方案1】:

我认为问题在于使用 optuna 构建模型。在几个错误并修复了很多问题之后,我得到了一切工作。如果有人感兴趣,这里是与我遇到的错误相关的部分。

    def create_model(trial):
# We optimize the numbers of layers, their units and weight decay parameter.

n_layers = trial.suggest_int("n_layers", 3, 20)
weight_decay = trial.suggest_float("weight_decay", 1e-100, 1e-1, log=True)
lr = trial.suggest_float("lr", 1e-12, 1e-1, log=True)
  
momentum = trial.suggest_float("momentum", 0.0, 1.0)

模型 = tf.keras.Sequential()

#model.add(Dropout(0.1))

for i in range(n_layers):
    
    dropout = trial.suggest_float("dropout_l".format(i), 0.05, 0.5)

    num_hidden = trial.suggest_int("n_units_l".format(i), 32, 256, log=True)

    model = Sequential()

    model.add(LSTM(num_hidden, input_shape=(train_x.shape[1:]), return_sequences=True))

    model.add(Dropout(rate=dropout)) 
    
    model.add(LSTM(num_hidden))

    model.add(Dropout(rate=dropout)) 
    
    model.add(Dense(num_hidden, activation='relu'))

    model.add(Dropout(rate=dropout)) 
    

model.add(tf.keras.layers.Flatten())

    model.add(Dense(
            num_hidden,
            activation="relu",
            kernel_regularizer=tf.keras.regularizers.l2(weight_decay)
        )
    )
model.add(Dense(2, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2(weight_decay)))
    #tf.keras.layers.Dense(2, kernel_regularizer=tf.keras.regularizers.l2(weight_decay)))

        # Compile model.
model.compile(
    optimizer=tf.keras.optimizers.SGD(lr=lr, momentum=momentum, nesterov=True),
    loss="sparse_categorical_crossentropy",
    metrics=["accuracy"],
)

return model

如果您想查看它的所有代码,这就是我目前所拥有的,需要大量整理,但它可以工作。非常感谢任何建议。

https://colab.research.google.com/drive/1cgnz7XUwnhfBvsA9whCXKQ3PrRs_sddh?usp=sharing

【讨论】:

以上是关于使用 optuna 进行优化时的 TensorFlow / keras 问题的主要内容,如果未能解决你的问题,请参考以下文章

pytorch深度学习模型调参策略:采用贝叶斯工具进行最优参数搜索及最佳步数确认

我可以同时优化多个模型吗?

python optuna-trial.py

使用手动 KFold-Cross 验证与 KerasClassifier-KFold 交叉验证时的不同结果

没有这样的选项:安装 tensorflow 对象检测 api 时的 --use-feature

使用内存映射文件MMF实现大数据量导出时的内存优化