Skip to main content
 首页 » 编程设计

python之如何在keras中将回归输出限制在0到1之间

2025年05月04日22bhlsheji

我正在尝试检测图像中单个对象的单个像素位置。我有一个 keras CNN 回归网络,我的图像张量作为输入,一个 3 项向量作为输出。

第一项:是 1(如果找到对象)或 0(未找到对象)

第二项:是一个介于0和1之间的数字,表示物体沿x轴有多远

第三项:是一个0到1之间的数字,表示物体沿y轴的距离

我在2000张测试图片和500张验证图片上训练了网络,val_loss远小于1,val_acc最好在0.94左右。太棒了。

但是当我预测输出时,我发现所有三个输出项的值都不在 0 和 1 之间,它们实际上大约在 -2 和 3 之间。所有三项都应介于 0 和 1 之间。

我没有在输出层使用任何非线性激活函数,并且对所有非输出层都使用了 relus。我应该使用 softmax,即使它是非线性的吗?第二项和第三项是预测图像的 x 轴和 y 轴,这在我看来是线性量。

这是我的 keras 网络:

inputs = Input((256, 256, 1)) 
 
base_kernels = 64  
 
 # 256 
conv1 = Conv2D(base_kernels, 3, activation='relu', padding='same', kernel_initializer='he_normal')(inputs) 
conv1 = BatchNormalization()(conv1) 
conv1 = Conv2D(base_kernels, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv1) 
conv1 = BatchNormalization()(conv1) 
conv1 = Dropout(0.2)(conv1) 
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1) 
 
# 128 
conv2 = Conv2D(base_kernels * 2, 3, activation='relu', padding='same', kernel_initializer='he_normal')(pool1) 
conv2 = BatchNormalization()(conv2) 
conv2 = Conv2D(base_kernels * 2, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv2) 
conv2 = BatchNormalization()(conv2) 
conv2 = Dropout(0.2)(conv2) 
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2) 
 
# 64 
conv3 = Conv2D(base_kernels * 4, 3, activation='relu', padding='same', kernel_initializer='he_normal')(pool2) 
conv3 = BatchNormalization()(conv3) 
conv3 = Conv2D(base_kernels * 4, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv3) 
conv3 = BatchNormalization()(conv3) 
conv3 = Dropout(0.2)(conv3) 
pool3 = MaxPooling2D(pool_size=(2, 2))(conv3) 
 
flat = Flatten()(pool3) 
 
dense = Dense(256, activation='relu')(flat) 
output = Dense(3)(dense) 
 
model = Model(inputs=[inputs], outputs=[output]) 
 
optimizer = Adam(lr=1e-4) 
model.compile(optimizer=optimizer, loss='mean_absolute_error', metrics=['accuracy']) 

有人可以帮忙吗?谢谢! :) 克里斯

请您参考如下方法:

sigmoid 激活产生介于 0 和 1 之间的输出,因此如果您将它用作最后一层的激活(输出),网络的输出将介于 0 和 1 之间。

output = Dense(3, activation="sigmoid")(dense)