如何通过config.yaml文件配置Keras的优化器与学习率
问题根源
你的写法报错是两个核心原因:
- YAML配置语法错误:
learning_rate : '1e-3缺少右侧闭合单引号,读取后格式异常;同时字符串类型的1e-3不能直接传入优化器作为学习率参数,需要转为浮点型。 - 调用优化器的逻辑错误:
tf.keras.optimizers.OPTIMIZER是将OPTIMIZER作为固定属性名查找,并不会读取OPTIMIZER变量存储的字符串(如SGD)来匹配对应的优化器类。
解决步骤
第一步:修正config.yaml配置
先修复语法错误,不需要给learning_rate加引号,直接写数值即可,YAML会自动解析为浮点型:
params: epochs: 10 batch_size: 128 num_classes: 10 loss_function: sparse_categorical_crossentropy metrics: accuracy optimizer: SGD validation_datasize: 5000 learning_rate : 1e-3
第二步:修改create_model中优化器调用逻辑
两种方案二选一即可:
方案1:使用getattr动态获取优化器类
通过反射机制,用变量存储的优化器名称字符串匹配对应的优化器类,同时修正原代码中compile方法缩进错误、函数无返回值的问题:
def create_model(LOSS_FUNCTION, OPTIMIZER, METRICS,LEARNING_RATE): LAYERS = [ tf.keras.layers.Flatten(input_shape=[28,28], name="inputlayer"), tf.keras.layers.Dense(300, name="hiddenlayer1"), tf.keras.layers.LeakyReLU(), tf.keras.layers.Dense(100, name="hiddenlayer2"), tf.keras.layers.LeakyReLU(), tf.keras.layers.Dense(10,activation="softmax", name="outputlayer") ] # 动态获取优化器类 optimizer_cls = getattr(tf.keras.optimizers, OPTIMIZER) INPUT_OPTIMIZER = optimizer_cls(learning_rate=LEARNING_RATE) model_clf = tf.keras.models.Sequential(LAYERS) model_clf.summary() model_clf.compile(loss=LOSS_FUNCTION, optimizer=INPUT_OPTIMIZER, metrics=[METRICS]) return model_clf
方案2:使用Keras自带的优化器解析接口(更简洁)
tf.keras.optimizers模块内置了get()方法,支持直接传入优化器名称和配置自动生成对应实例:
def create_model(LOSS_FUNCTION, OPTIMIZER, METRICS,LEARNING_RATE): LAYERS = [ tf.keras.layers.Flatten(input_shape=[28,28], name="inputlayer"), tf.keras.layers.Dense(300, name="hiddenlayer1"), tf.keras.layers.LeakyReLU(), tf.keras.layers.Dense(100, name="hiddenlayer2"), tf.keras.layers.LeakyReLU(), tf.keras.layers.Dense(10,activation="softmax", name="outputlayer") ] # 直接传入配置自动生成优化器实例 INPUT_OPTIMIZER = tf.keras.optimizers.get({ "class_name": OPTIMIZER, "config": {"learning_rate": LEARNING_RATE} }) model_clf = tf.keras.models.Sequential(LAYERS) model_clf.summary() model_clf.compile(loss=LOSS_FUNCTION, optimizer=INPUT_OPTIMIZER, metrics=[METRICS]) return model_clf
内容的提问来源于stack exchange,提问作者thangaraj1980
相关产品推荐
相关产品推荐

