python - TensorFlow 中的学习率衰减 - 分段常量函数出错
问题描述
我正在尝试使用 Tiny YOLO v2 的代码库。我在声明学习率计划时遇到了以下错误。我可以看到我的值与我step
的值相同,lr
但不确定什么是好的修复。我已经尝试明确声明值(steps
小于lr
)以及导致的错误。
错误:
回溯(最后一次调用):文件“scripts/train_tiny_yolo.py”,第 335 行,在 lr = tf.train.piecewise_constant(global_step, steps, lrs) 文件“/Users/nivedithakalavakonda/Desktop/python_environments/objectdet_tf1/lib/ python3.6/site-packages/tensorflow/python/training/learning_rate_decay.py”,第 147 行,在分段常量名称 = 名称)文件“/Users/nivedithakalavakonda/Desktop/python_environments/objectdet_tf1/lib/python3.6/site-packages /tensorflow/python/training/learning_rate_decay_v2.py”,第 166 行,在分段常量中“边界的长度应该比值的长度小 1”)ValueError:边界的长度应该比值的长度小 1
这是我的代码中的相关部分:
base_lr = params.get('learning_rate', 1e-3)
steps = params.get('steps', [3000, 4000, 5000])
steps_and_lrs = []
if steps[0] > 100:
# Warm-up
steps_and_lrs += [
(25, base_lr / 100),
(50, base_lr / 10)
]
steps_and_lrs += [(step, base_lr * 10**(-i)) for i, step in enumerate(steps)]
steps, lrs = zip(*steps_and_lrs)
# Alternative attempt to explicitly declare lr and steps values
# steps =( 50, 20000, 30000, 40000)
# lrs = (1e-05, 0.0001, 0.001, 0.0001, 1e-05)
max_iter = steps[-1]
lr = tf.train.piecewise_constant(global_step, steps, lrs)
np.set_printoptions(precision=3, suppress=True)
opt = tf.train.MomentumOptimizer(lr, momentum=0.9)
grads_and_vars = opt.compute_gradients(loss)
clip_value = params.get('clip_gradients')
if clip_value is not None:
grads_and_vars = [(tf.clip_by_value(g, -clip_value, clip_value), v) for g, v in grads_and_vars]
train_op = opt.apply_gradients(grads_and_vars,
global_step=global_step)
merged = tf.summary.merge_all()
我尝试了什么:
当我明确给出 steps 和 lr 的值时,我得到以下值错误:
回溯(最后一次调用):文件“scripts/train_tiny_yolo.py”,第 363 行,在 grads_and_vars = [(tf.clip_by_value(g, -clip_value, clip_value), v) for g, v in grads_and_vars] 文件“scripts/ train_tiny_yolo.py”,第 363 行,在 grads_and_vars = [(tf.clip_by_value(g, -clip_value, clip_value), v) for g, v in grads_and_vars] 文件“/Users/nivedithakalavakonda/Desktop/python_environments/objectdet_tf1/lib/python3 .6/site-packages/tensorflow/python/util/dispatch.py”,第 180 行,在包装器返回目标(*args,**kwargs)文件“/Users/nivedithakalavakonda/Desktop/python_environments/objectdet_tf1/lib/python3. 6/site-packages/tensorflow/python/ops/clip_ops.py”,第 69 行,在 clip_by_value t = ops.convert_to_tensor(t, name="t") 文件中“/Users/nivedithakalavakonda/Desktop/python_environments/objectdet_tf1/lib/python3.6/site-packages/tensorflow/python/framework/ops.py”,第 1039 行,在 convert_to_tensor 返回 convert_to_tensor_v2(值,dtype,preferred_dtype,名称)文件“ /Users/nivedithakalavakonda/Desktop/python_environments/objectdet_tf1/lib/python3.6/site-packages/tensorflow/python/framework/ops.py”,第 1097 行,在 convert_to_tensor_v2 as_ref=False) 文件“/Users/nivedithakalavakonda/Desktop/ python_environments/objectdet_tf1/lib/python3.6/site-packages/tensorflow/python/framework/ops.py”,第 1175 行,internal_convert_to_tensor ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref) 文件“ /Users/nivedithakalavakonda/Desktop/python_environments/objectdet_tf1/lib/python3.6/site-packages/tensorflow/python/framework/constant_op.py”,第 304 行,在 _constant_tensor_conversion_function 返回常量(v,dtype=dtype,name=name)文件“/Users/nivedithakalavakonda/Desktop/python_environments/objectdet_tf1/lib/ python3.6/site-packages/tensorflow/python/framework/constant_op.py”,第 245 行,常量 allow_broadcast=True) 文件“/Users/nivedithakalavakonda/Desktop/python_environments/objectdet_tf1/lib/python3.6/site-packages /tensorflow/python/framework/constant_op.py”,第 283 行,在 _constant_impl allow_broadcast=allow_broadcast)) 文件“/Users/nivedithakalavakonda/Desktop/python_environments/objectdet_tf1/lib/python3.6/site-packages/tensorflow/python/framework /tensor_util.py",第 454 行,在 make_tensor_proto 中引发 ValueError("不支持任何值。")
当前使用 TensorFlow 1.13.1。
任何帮助表示赞赏。请让我知道共享大型代码库是否会更有洞察力。
解决方案
根据您的代码,steps
并且lrs
大小相同。请检查[此处]提供的示例。根据此文档, 中的值的数量steps
应该比 中的值的数量少 1 lrs
。另外,请注意,此调度程序中存在错误。你可以在这里查看。
如果您使用的是 tensorflow 2.0,下面是一个有效的示例。我没有用 tf 1.13 测试过这个。
import numpy as np
from tensorflow.python.keras.optimizer_v2 import learning_rate_schedule
n_step_epoch = 100
init_lr = 0.01
decay = 0.1
decay_type = 'multistep_15_25_100'
milestones = decay_type.split('_')
milestones.pop(0)
milestones = list(map(lambda x: int(x), milestones))
boundaries = np.multiply(milestones,n_step_epoch)
values = [init_lr] + [init_lr/(decay**-i) for i in range(1,len(milestones)+1)]
learning_rate =learning_rate_schedule.PiecewiseConstantDecay(boundaries.tolist(), values)
希望这可以帮助!
推荐阅读
- java - 如何在使用 java opencsv 阅读时跳过 csv 标头中的附加 (,) 逗号
- php - 文件上传到目录不起作用,没有文件
- swift - eureka formviewcontroller中的引脚部分标题
- vba - 通过 vba ms 访问将多值列的数据绑定到组合框中
- node.js - 通过 id 从 firebase 获取数据
- php - 从数据库中获取数组键(来自第 2 列)和数组值(来自第 1 列)
- html - 一台服务器上的 sitemap.xml 404 错误,而不是另一台服务器上的错误?
- linux - 有没有办法在 linux 命令提示符中包含当前分支名称变量?
- elasticsearch - 在 Elasticsearch 中对嵌套类型使用命名查询(matched_queries)?
- python - 在 datframe 的每一行中添加两个已经在字典中的字典