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

如何解决实现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)。

修复方案

  1. 在所有函数定义前添加全局变量声明:
    # 定义压缩因子,DenseNet常用值为0.5
    compression = 0.5
    # 数据集类别数,你的场景是4分类
    categories = 4
    
  2. (可选优化)避免依赖全局变量l,将l作为参数传入denseblock函数,增强代码健壮性:
    修改denseblock的定义:
    def denseblock(input, num_filter=12, dropout_rate=0.2, l=7):
        global compression
        temp = input
        for _ in range(l): 
            # 原有代码保持不变...
    
    调用时如果需要自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:00:53