You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow添加正则化时get_collection属性不存在报错解决

报错原因

你参考的方案是TensorFlow 1.x 静态图模式下的旧API实现,tf.get_collection、tf.GraphKeys接口在TensorFlow 2.x版本中已经被移除,不需要额外给tensorflow模块补充属性,直接使用TensorFlow 2.x+Keras适配的正则化写法即可解决问题。

适配TF2的正则化实现逻辑
  • Keras内置层(比如Dense、Conv2D等)原生支持正则化参数配置,直接在层初始化时传入kernel_regularizer(权重正则)、bias_regularizer(偏置正则)即可定义正则项
  • 不需要手动收集正则损失、手动拼接总损失:只要层里定义了正则项,Keras训练时会自动将所有正则损失加入总损失计算,无需额外编写收集逻辑
  • 如果确实需要手动获取正则损失列表,TF2中使用model.losses即可拿到当前模型所有层的正则损失,不需要调用旧版的集合接口
修正后的完整代码
def get_trained_model(X,y,hidden_size_list, steps, lambdaa = 0):
    model = keras.models.Sequential()
    model.add(keras.layers.Flatten(input_shape = (X.shape[1],)))
    for hs in hidden_size_list:
        # 给隐藏层Dense加L2正则,需要L1正则替换为keras.regularizers.L1即可
        model.add(keras.layers.Dense(
            hs, 
            activation = 'relu',
            kernel_regularizer=keras.regularizers.L2(l2=lambdaa)
        ))
    # 输出层也可按需加正则
    model.add(keras.layers.Dense(2, kernel_regularizer=keras.regularizers.L2(l2=lambdaa)))
    
    my_normal_loss = keras.losses.SparseCategoricalCrossentropy(from_logits = True)
    # 删除旧版TF1的正则收集、手动拼接损失逻辑,Keras自动汇总正则损失
    optim = keras.optimizers.Adam(learning_rate = 0.001)
    metrics = ["accuracy"]
    # 直接传入基础损失即可,正则项会自动加入总损失
    model.compile(loss = my_normal_loss, optimizer = optim, metrics = metrics)
    batch_size = X.shape[0]
    model.fit(X, y, batch_size = batch_size, epochs = steps, shuffle = True, verbose =1)

    # 修正原代码笔误:原代码写的return mode为拼写错误
    return model

注意:如果lambdaa设为0,等价于不添加任何正则化,和无正则的模型行为完全一致。

内容的提问来源于stack exchange,提问作者lior1zh2000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 12:09:12