You need to enable JavaScript to run this app. 如何在R语言Keras中实现无零填充U-Net的中心裁剪操作
优惠活动
大模型
产品
解决方案
定价
更多

如何在R语言Keras中实现无零填充U-Net的中心裁剪操作

无零填充U-Net在R版Keras中的落地实现
  • 现有R语言生态的unet包内置实现固定使用零填充模式,不支持调整padding = "valid"参数,无法直接复现原论文中带中心裁剪的无填充结构
  • 无填充U-Net的核心设计逻辑:编码阶段所有卷积层不做边缘零值填充,特征图尺寸随卷积操作自然缩小;解码阶段上采样得到的特征图尺寸,和对应编码层跳过连接的特征图尺寸存在差值,需要对编码侧特征做中心裁剪,才能和上采样结果完成通道拼接,避免零填充带来的边缘预测伪影

核心功能实现

首先搭建自定义中心裁剪层,适配Keras R的张量计算逻辑:

# 输入:待裁剪的特征张量、目标裁剪尺寸(高、宽)
center_crop_layer <- function(x, target_height, target_width) {
  # 读取当前特征图的实际尺寸
  current_shape <- k_shape(x)
  current_h <- current_shape[[2]]
  current_w <- current_shape[[3]]
  
  # 计算居中裁剪的起始偏移量
  crop_top <- (current_h - target_height) %/% 2
  crop_left <- (current_w - target_width) %/% 2
  
  # 提取居中的目标尺寸特征块
  cropped_x <- x[, crop_top:(crop_top + target_height - 1), crop_left:(crop_left + target_width - 1), ]
  return(cropped_x)
}

网络结构搭建逻辑

  • 编码阶段:每一组卷积块全部使用padding = "valid"的二维卷积,不做任何边缘填充,特征图尺寸按照「原尺寸 - 卷积核尺寸 + 1」的规则自然缩小
  • 跳过连接处理:每从编码侧提取特征给解码层时,先通过上述中心裁剪函数,将编码特征裁剪到和解码侧上采样输出完全一致的尺寸,再执行通道拼接
  • 解码阶段:上采样模块、后续卷积操作统一和编码侧保持一致的填充规则,保证最终输出的分割图尺寸和输入原图的有效特征区域完全对齐

简化结构示例

# 以原论文572*572输入的简化U-Net结构为例
input <- layer_input(shape = c(572, 572, 3))

# 编码块1
enc1 <- input %>% 
  layer_conv_2d(filters = 64, kernel_size = 3, padding = "valid") %>% 
  layer_conv_2d(filters = 64, kernel_size = 3, padding = "valid")
pool1 <- enc1 %>% layer_max_pooling_2d(pool_size = 2, strides = 2)

# 编码块2
enc2 <- pool1 %>% 
  layer_conv_2d(filters = 128, kernel_size = 3, padding = "valid") %>% 
  layer_conv_2d(filters = 128, kernel_size = 3, padding = "valid")
pool2 <- enc2 %>% layer_max_pooling_2d(pool_size = 2, strides = 2)

# 解码块1:上采样后和裁剪后的编码特征拼接
up1 <- pool2 %>% 
  layer_conv_2d_transpose(filters = 128, kernel_size = 2, strides = 2, padding = "valid")
crop_enc2 <- center_crop_layer(
  enc2, 
  target_height = k_int_shape(up1)[[2]], 
  target_width = k_int_shape(up1)[[3]]
)
concat1 <- layer_concatenate(list(up1, crop_enc2), axis = -1)
dec1 <- concat1 %>% 
  layer_conv_2d(filters = 128, kernel_size = 3, padding = "valid") %>% 
  layer_conv_2d(filters = 64, kernel_size = 3, padding = "valid")
# 后续解码层按照相同的「上采样-中心裁剪编码特征-拼接-卷积」逻辑依次搭建即可

注意:无填充结构的特征图尺寸会随3x3卷积操作逐次缩小,需要提前匹配输入图的适配尺寸,避免出现特征图尺寸小于卷积核、无法正常计算的问题。原论文采用572x572的输入尺寸,最终输出的分割图尺寸刚好为388x388,完全对应输入图的有效预测区域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 14:54:03