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
相关产品推荐
相关产品推荐

