如何解决实现DenseNet时出现的NameError: name 'compression' is not defined错误?
解决DenseNet实现中的
NameError: name 'compression' is not defined问题 在实现针对4分类图像数据集的DenseNet模型时,运行代码触发NameError: name 'compression' is not defined错误。以下是出错的代码片段:
模型构建代码
def denseblock(input, num_filter = 12, dropout_rate = 0.2): global compression temp = input for _ in range(l): BatchNorm = BatchNormalization()(temp) relu = Activation('relu')(BatchNorm) Conv2D_3_3 =Conv2D(int(num_filter*compression), (3,3), use_bias=False ,padding='same')(relu) if dropout_rate>0: Conv2D_3_3 = Dropout(dropout_rate)(Conv2D_3_3) concat = Concatenate(axis=-1)([temp,Conv2D_3_3]) temp = concat return temp ## transition Block def transition(input, num_filter = 12, dropout_rate = 0.2): global compression BatchNorm = BatchNormalization()(input) relu = Activation('relu')(BatchNorm) Conv2D_BottleNeck = Conv2D(int(num_filter*compression), (1,1), use_bias=False ,padding='same')(relu) if dropout_rate>0: Conv2D_BottleNeck = Dropout(dropout_rate)(Conv2D_BottleNeck) avg = AveragePooling2D(pool_size=(2,2))(Conv2D_BottleNeck) return avg #output layer def output_layer(input): global compression BatchNorm = BatchNormalization()(input) relu = Activation('relu')(BatchNorm) AvgPooling = AveragePooling2D(pool_size=(2,2))(relu) flat = Flatten()(AvgPooling) output = Dense(categories, activation='softmax')(flat) return output
创建模型代码
l = 7 input = Input(shape=(height, width, 3)) First_Conv2D = Conv2D(30, (3,3), use_bias=False ,padding='same')(input) First_Block = denseblock(First_Conv2D, 30, 0.5) First_Transition = transition(First_Block, 30, 0.5) Last_Block = denseblock(First_Transition, 30, 0.5) output = output_layer(Last_Block) model = Model(inputs=[input], outputs=[output])
错误原因
代码中三个函数都声明了global compression,但这个全局变量从未被定义。compression是DenseNet过渡层的压缩因子,作用是减少特征通道数,是必须提前定义的超参数。同时output_layer中用到的categories变量也未定义(你的数据集是4分类,需设为4)。
修复方案
- 在所有函数定义前添加全局变量声明:
# 定义压缩因子,DenseNet常用值为0.5 compression = 0.5 # 数据集类别数,你的场景是4分类 categories = 4 - (可选优化)避免依赖全局变量
l,将l作为参数传入denseblock函数,增强代码健壮性:
修改denseblock的定义:
调用时如果需要自定义l值,传入参数即可:def denseblock(input, num_filter=12, dropout_rate=0.2, l=7): global compression temp = input for _ in range(l): # 原有代码保持不变...First_Block = denseblock(First_Conv2D, 30, 0.5, l=7) Last_Block = denseblock(First_Transition, 30, 0.5, l=7)
修改后的完整代码示例
from tensorflow.keras.layers import Input, Conv2D, BatchNormalization, Activation, Dropout, Concatenate, AveragePooling2D, Flatten, Dense from tensorflow.keras.models import Model # 全局超参数定义 compression = 0.5 categories = 4 def denseblock(input, num_filter=12, dropout_rate=0.2, l=7): global compression temp = input for _ in range(l): BatchNorm = BatchNormalization()(temp) relu = Activation('relu')(BatchNorm) Conv2D_3_3 = Conv2D(int(num_filter*compression), (3,3), use_bias=False, padding='same')(relu) if dropout_rate>0: Conv2D_3_3 = Dropout(dropout_rate)(Conv2D_3_3) concat = Concatenate(axis=-1)([temp, Conv2D_3_3]) temp = concat return temp def transition(input, num_filter=12, dropout_rate=0.2): global compression BatchNorm = BatchNormalization()(input) relu = Activation('relu')(BatchNorm) Conv2D_BottleNeck = Conv2D(int(num_filter*compression), (1,1), use_bias=False, padding='same')(relu) if dropout_rate>0: Conv2D_BottleNeck = Dropout(dropout_rate)(Conv2D_BottleNeck) avg = AveragePooling2D(pool_size=(2,2))(Conv2D_BottleNeck) return avg def output_layer(input): global compression BatchNorm = BatchNormalization()(input) relu = Activation('relu')(BatchNorm) AvgPooling = AveragePooling2D(pool_size=(2,2))(relu) flat = Flatten()(AvgPooling) output = Dense(categories, activation='softmax')(flat) return output # 创建模型 l = 7 # 替换为你的图像尺寸,比如height=224, width=224 height, width = 224, 224 input = Input(shape=(height, width, 3)) First_Conv2D = Conv2D(30, (3,3), use_bias=False, padding='same')(input) First_Block = denseblock(First_Conv2D, 30, 0.5, l=l) First_Transition = transition(First_Block, 30, 0.5) Last_Block = denseblock(First_Transition, 30, 0.5, l=l) output = output_layer(Last_Block) model = Model(inputs=[input], outputs=[output]) # 可查看模型结构 model.summary()
内容的提问来源于stack exchange,提问作者Rezuana Haque
相关产品推荐
相关产品推荐

