【日常学习】U-net的改进

【日常学习】U-net的改进

文章地址:基于改进 U-NET 网络的神经分割方法研究

ResNet

ResNet建立的模块如下:
ResNet建立的模块
残差网络提出了一个捷径(shortcut)的概念,即跳过一个或多个层,将输入结果直接添加到底层,残差网络可以通过下面的公式1来表示
H ( x ) = x + F ( x )                                       ( 1 ) H (x) = x + F(x)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(1) H(x)=x+F(x)                                     (1)
其中 H ( x ) H(x) H(x)为底层的映射, x x x为输入结果, F ( x ) F(x) F(x)为网络中的隐藏层输出结果。
残差网络通过将多个卷积层级联的输出与输入相加的方式对图片进行特征提取,减少了训练参数。
在卷积神经网络中,网络层次越深,训练时产生的错误越多,训练时间越长。残差网络的出现在一定程度上解决了这个问题。
与其他网络相比,残差网络结构相对简单,训练参数较少,训练时间较短,解决了在极深度条件下深度卷积神经网络性能退化的问题。

U-net与ResNet结合

改进后的U-NET分为收缩网络以及扩张网络两部分。

收缩网络与U-NET中的收缩网络类似,有所不同的是,对于每一层输出的结果先进行规范化处理,随后通过激活函数进行激活。每一个下采样包含两个3x3的卷积层,一个1x1的“捷径”以及一个2x2的池化层。

扩张网络与 U-NET 中的扩张网络类似,每一次上采样包含两个 3x3的卷积层,一个 1x1 的“捷径”,在每一次上采样之前,需要合并收缩网络与之相对应的结果。与收缩网络相似,扩张网络中每一层输出结果都需要先进性规范化处理,随后通过激活函数进行激活。最后,加入 1x1 的卷积网络确定 该特征图所对应的结果。

改进后的 U-NET 网络结构如下图所示。
改进后的U-net网络结构
改进后的U-NET网络结构示意图,与U-NET网络相比,改进后的U-NET加入了残差网络,并且对于每一层输出结果进行规范化处理。红色的箭头表示“捷径”层,绿色的方块表示通过“捷径” 层后获取的结果,灰色方块代表上采样过程中对于边界信息的补充。

加入残差网络后的U-NET网络,层次更加深入,训练参数更多,在一定程度上弥补了 U-NET网络不够深的问题,同时由于残差网络的特性,解决了在极深度条件下深度卷积神经网络性能退化的问题。

捷径层(Shortcut)

我们将该网络结构用下面的公式表示
y = W n + 1 K ( w n x ) + b x                      ( 2 ) y = W_{n+1}K(w_nx) + bx ~~~~~~~~~~~~~~~~~~~~(2) y=Wn+1K(wnx)+bx                    (2)

这里 y y y x x x表示该网络的输出以及输入, W n + 1 W_{n+1} Wn+1表示权值, K K K表示激活函数; b b b为一个可调节的参数,默认为 1。

一个“捷径”层中可以包含多个卷积层,我们可以将 W n + 1 K ( w n x ) W_{n+1}K(w_nx) Wn+1K(wnx)通过 F ( x , w i ) F(x,w_i) F(x,wi)表示多个卷积层的情况,改进后的公式如(3)所示
y = F ( x , w i ) + b x                  ( 3 ) y = F(x,w_i) + bx ~~~~~~~~~~~~~~~~(3) y=F(x,wi)+bx                (3)
引入“捷径”层使得U-NET的网络结构更加深入,同时也避免了训练时间过长,训练参数过多以及过拟合现象的发生。

损失函数(Loss)

损失函数(loss function)是用来评估预测值参考值(ground truth)之间的不一致程度,损失函数越小,模型的鲁棒性越好。
我们将 L ( X , Y ) L(X, Y) L(X,Y)作为该模型的损失函数, L ( X , Y ) L(X, Y) L(X,Y)如公式(4)所示
L(X,Y)公式
其中 X X X表示预测值, Y Y Y表示参考值, S ( X , Y ) S(X,Y) S(X,Y)表示两个模型之间的相似程度, S ( X , Y ) S(X, Y) S(X,Y)表达式如(5)所示。
S(X,Y)公式
∣ X ∩ Y ∣ |X∩Y| XY表示两个样本间相交部分或重叠部分, ∣ X ∣ + ∣ Y ∣ |X|+|Y| X+Y表示预测值和参考值的总量

优化函数

优化函数在训练模型的同时,帮助模型调整权值,使得模型权值调整到最优,使得损失函数最小。Adam具有计算高效,占用内存较少,善于处理非平稳模型等优势。

### 改进UNet模型以适应宋史相关数据 #### 数据预处理 对于特定领域如宋史的数据,数据预处理阶段至关重要。考虑到历史文档可能存在的特殊字符、古汉语表达方式以及手写体识别等问题,可以采用专门针对这些特点的技术手段来增强模型的表现力[^1]。 ```python import cv2 from skimage import io, transform def preprocess_image(image_path): image = io.imread(image_path, as_gray=True) resized_image = transform.resize(image, (target_height, target_width)) normalized_image = (resized_image - np.mean(resized_image)) / np.std(resized_image) return normalized_image ``` #### 更换激活函数 为了提高模型对复杂特征的学习能力,在原有基础上尝试替换不同类型的激活函数是一个有效的策略。例如ReLU及其变种Leaky ReLU可以在一定程度上缓解梯度消失问题;而像Swish这样新型的自门控激活函数则能进一步提升性能表现[^2]。 ```python class UNetBlock(nn.Module): def __init__(self, in_channels, out_channels, activation=nn.ReLU(inplace=True)): super(UNetBlock, self).__init__() self.conv1 = nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=(3, 3), padding='same') self.actv1 = activation self.conv2 = nn.Conv2d(in_channels=out_channels, out_channels=out_channels, kernel_size=(3, 3), padding='same') self.actv2 = activation def forward(self, x): y = self.conv1(x) y = self.actv1(y) z = self.conv2(y) output = self.actv2(z) return output ``` #### 特征融合机制 引入多尺度上下文信息有助于捕捉到更多细节层次上的变化规律,这对于理解古代文献中的细微差别尤为重要。可以通过设计更精细的空间金字塔池化模块(SPP),或者借鉴DenseNet的思想增加跨层连接等方式实现这一点。 #### 自定义损失函数 鉴于宋史资料可能存在标注不一致的情况,调整损失计算方法也是必要的考虑因素之一。比如利用Dice系数作为补充评价指标,它特别适合于衡量二分类任务下的区域重叠程度,从而帮助改善边界模糊样本点预测精度不足的问题。 ```python def dice_loss(preds, targets, smooth=1e-7): intersection = torch.sum(targets * preds) union = torch.sum(targets) + torch.sum(preds) score = (2.0 * intersection + smooth) / (union + smooth) loss = 1.0 - score return loss ```
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值