我正在尝试将通过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)
到目前为止,我还没有办法通过训练直接向后传播模型的大小,但是有更好的方法吗?
感谢您的考虑!
答案 0 :(得分:0)
如果我对您的理解正确,那么这是关于如何设计损失函数的问题,而不是直接关于hyperopt的问题。正确?如果是这样的话,如果您确实确实有一个100kb的极限值,那么我就不会扩大您的训练损失(因为这可能会导致奇怪的伪像,例如性能不佳,但很小的模型占据了第一位)。
如果模型大小小于100kb,否则返回天文数字,您如何报告常规训练损失?只是一个主意。