将HParam传递到自定义ResNet时发生TypeError

问题描述

自定义resnet模型的功能如下:

def get_resnet(
    inputs,init_nf=16,init_ks=5,init_drop=.2,res_drop=.5
    repeats=None,num_groups=3,augment=[],exp_repeat=True,):

    x = inputs
    if augment: x = Augmentation(augment)(x)
    x= ConvBNDrop(init_nf,init_ks,drop=init_drop)(x)
    nf = 2*init_nf
    if not repeats: repeats = [2**i for i in range(num_groups)] if exp_repeat else list(range(1,num_groups+1))
    for i,r in enumerate(repeats):
        x = ConvBNDrop(nf*2**i,3,stride=s,drop=res_drop)(x)
        x = ResBlock(nf*2**i,r,drop=res_drop)(x)
    x = kl.GlobalMaxPooling1d(name='embedding')(x)
    x = kl.Dropout(.5)(x)
    x = kl.Dense(1,'sigmoid')(x)
    return tf.keras.Model(inputs=inputs,outputs=x,name='resnet')

HParam变量是:

HP_INIT_NF = hp.HParams('num_filters',hp.discrete([16,32])
HP_INIT_DROP = hp.HParams('init_drop',hp.RealInterval(0.1,0.2))
HParaMS = [HP_INIT_NF,HP_INIT_DROP]

指标变量是:

METRICS = [hp.Metric('AUC',display_name='AUC'),hp.Metric('Precision',display_name='Precision')]

调整后的resnet功能可反映多个演示和教程的功能

def tuned_resnet(hparams,log_dir):
    model = get_resnet(tk.keras.Input([None,13]),init_nf = HParaMS[HP_INIT_NF],init_drop = HParaMS[HP_INIT_DROP])

    model.compile(optimizer='adam',loss='binary_crossentropy',metrics=METRICS)

    callbacks = [tf.keras.callbacks.Tensorboard(log_dir),hp.keRascallback(log_dir,hparams)]

    model.fit(train_ds,epochs=10,valid_ds,callbacks=callbacks)

    return metrics
     

通过以下方式调用模型函数

session_num = 0

for num_filters in HP_INIT_NF.domain.values:
    hparams = {HP_INIT_NF: num_filters}

    run_name = "run-%d" % session_num
    print('--- Starting trial: %s' % run_name)
    print({h.name: hparams[h] for h in hparams})
    tuned_resnet(hparams,'logs/hparam_tuning/' + run_name)
    session_num += 1

运行这些代码块后,会话将引发:

TypeError: Dimension value must be integer or None or have an __index__ method,got HParam('num_filters',32])

错误是HParam定义中的错误,还是具有自定义resnet期望的错误?关于如何解决该问题以及是否接受HParam的任何想法?

Python 3.7 Tensorflow 2.1 Tensorboard 2.1.0

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)