0

我正在尝试将通过 TensorFlow Keras (.pb) 创建的冻结图加载到内存有限的微控制器上。通过 Hyperopt(...) 我正在优化我的训练超参数,但是我想将结果模型的大小作为搜索空间的一部分。目前,我将使用加权损失作为 hyperopt 的输入,如下所示:

def optimizer(args):
...
  training_history = nn.train_v00(....)
  file_bytes = int(os.path.getsize(frozen_graph_filepath)) # returns size in bytes

  final_loss = training_history.history['loss'][-1]
  weighted_loss = final_loss*(file_bytes/(100*1024)) # Want model smaller than 100KB

  if OPTIMIZATION_TARGET == 'loss':
    return_struct = {
      'status': STATUS_OK,
      'loss': weighted_loss,
      'epochs': epochs,
      'metrics': {
        'accuracy': final_acc
       }
    }

    return return_struct

space = {
  'learning_rate': hp.loguniform('learning_rate', np.log(0.00001), np.log(0.05)),
  'dropout': hp.uniform('dropout', 0, 0.5),
  'batch_size': hp.quniform('batch_size', 32, 128, 2),
  'input_seq_len': hp.quniform('seq_len', 32, N_ADC_SAMPLES, 2),
  'cnn_n_filters': hp.quniform('cnn_n_filters', 1, 10, 1),
  'cnn_kernel_size': hp.quniform('cnn_kernel_size', 1, 10, 1),
  'cnn_pool_size': hp.quniform('cnn_pool_size', 1, 10, 1)
}
t = Trials()
best = fmin(optimizer, space, algo=tpe.suggest, max_evals=MAX_EVALS, trials=t)

从我迄今为止发现的情况来看,没有办法通过训练直接反向传播模型的大小,但是有没有更好的方法呢?

感谢您的考虑!

4

1 回答 1

0

如果我理解正确,这是一个关于如何制作损失函数的问题,而不是直接关于 hyperopt。正确的?如果是这样,如果你确实有一个 100kb 的硬截断,我不会扩大你的训练损失(因为它可能会导致奇怪的伪影,比如表现不佳,但非常小的模型占据了第一位)。

如果模型大小小于 100kb,您如何报告常规训练损失,否则返回一个天文数字?只是一个想法。

于 2019-11-22T09:27:59.820 回答