如何解决将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 举报,一经查实,本站将立刻删除。