周纵苇——三维迁移学习报告笔记

最近自己会把自己个人博客中的文章陆陆续续的复制到CSDN上来,欢迎大家关注我的 个人博客,以及我的github

本文主要是记录周纵苇(U-Net++的作者)大神关于三维迁移学习的报告的笔记。原文请参考三维迁移学习

0. 研究背景

医学图像的一大难点是标注困难,需要耗费医生大量的人力和物力。迁移学习可以从大量其他数据集中预训练得到初始的模型,在针对某个特定的任务时,可以让模型从一个更优的起点开始训练。在医学影像处理中,从ImageNet的预训练模型开始做迁移学习已经成为了一个标配,但是ImageNet的模型输入必须是二维的,并且存在医学图像与自然图像差别较大的问题。

3D的神经网络模型一般要优于2D的,但是也存在模型参数多,而训练样本少,容易导致过拟合和欠拟合的问题。此外还希望模型能够做到自监督学习,即直接从无标签数据中自行学习。他们提出的自监督学习方法就是先在原图上做一些改动,然后让模型去还原原图。并提出了四种可选的图形变换方法:非线性变换,局部像素重组,向内填充和向外填充。

1. 非线性变换

在CT图像中,人体不同器官和组织是有不同的像素值(Hounsfield Units,亨斯菲尔德单位)的。现在只将某个组织的亨氏值的范围改变而其他诸如形态等特性都不变,如果网络模型能够将像素值还原为正确的范围,则说明该模型识别出了该组织的正确分类。

所以可以随机生成一个色彩变换曲线,并加到原图中,就得到了一张经过非线性变换的图片。值得注意的是该色彩变换曲线需要是单调的,因为需要在变换后的图像与原图之间建立起一一对应的关系,不然模型很难恢复。得到该曲线的方式有很多种,他们使用的是 Bezier Curve(贝塞尔曲线)的方式。

3f2e7b30ly1g79qgksr8vj212w0luwln

2. 局部打乱

在原图中随机地选择一个局部小区域的位置和大小,并将该区域内的像素打乱。之所以是局部区域是因为卷积层的感知域是有限的,如果打乱的像素距离太远,复原原图就比困难了。我们希望模型能够复原被打乱的结构的细节纹理和边缘信息。

3f2e7b30ly1g79qgionktj212w0lu7e6

3. 内向填充和外向填充

向外填充就是把原图的边缘一圈给遮住,然后让模型填充;向内填充就是把原图的中间一些区域遮住,让模型填充。遮住的方法是用一些随机的数替代原来的像素值。实验结果也表明,向外填充学习到的视觉特征更强。

4. 融合

我们为以上 3 种图像变换都设置一个发生率,但是内填充和外填充不能同时发生,因为那样所留下的信息太少了。

5. 效果

(1) 预训练的3D模型效果高于从头训练的3D模型

(2) 预训练的3D模型效果高于预训练的2D模型

(3) 用以上自监督学习方法预训练的2D模型效果和ImageNet的监督学习效果相近

6. 其他

怎么用这个2D模型去处理3D的数据:

(1)相邻的3层当作RGB三通道输入(2D)

(2)相互正交的x,y,z面上的三层作为RGB三通道输入(2.5D)

(3)先对3D的cube校准,然后把相互正交的x,y,z面上的三层作为RGB三通道输入(VIOR)。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一维卷积神经网络(1D CNN)可以用于处理序列数据,例如文本和时序数据。对于一维CNN的迁移学习,我们可以使用预训练的一维卷积神经网络模型,例如在自然语言处理中常用的GloVe和Word2Vec模型,或者在时序数据处理中常用的WaveNet和TCN等模型。 下面是一个使用GloVe模型进行文本分类的一维CNN迁移学习的例子: ```python import numpy as np import tensorflow as tf from tensorflow.keras.preprocessing.text import Tokenizer from tensorflow.keras.preprocessing.sequence import pad_sequences from tensorflow.keras.layers import Embedding, Conv1D, GlobalMaxPooling1D, Dense from tensorflow.keras.models import Sequential from gensim.models import KeyedVectors # 加载预训练的词向量模型(GloVe) glove_model = KeyedVectors.load_word2vec_format('glove.6B.100d.bin', binary=True) # 准备训练数据 texts = ['This is a good movie', 'This is a bad movie', 'I really enjoyed it', 'I did not like it', 'The movie was great'] labels = [1, 0, 1, 0, 1] # 对文本进行分词,并将词转换成词向量 tokenizer = Tokenizer() tokenizer.fit_on_texts(texts) sequences = tokenizer.texts_to_sequences(texts) word_index = tokenizer.word_index embedding_matrix = np.zeros((len(word_index) + 1, 100)) for word, i in word_index.items(): if word in glove_model: embedding_matrix[i] = glove_model[word] # 对序列进行填充 maxlen = 10 data = pad_sequences(sequences, maxlen=maxlen) # 构建模型 model = Sequential([ Embedding(input_dim=len(word_index) + 1, output_dim=100, weights=[embedding_matrix], input_length=maxlen, trainable=False), Conv1D(32, 5, activation='relu'), GlobalMaxPooling1D(), Dense(1, activation='sigmoid') ]) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(data, labels, epochs=10, batch_size=16) ``` 在上面的例子中,我们首先加载了预训练的GloVe词向量模型,并将文本数据转换成序列数据,并将每个词转换成对应的词向量。接着,我们构建了一个一维CNN模型,其中第一层使用了预训练的词向量作为权重,然后通过一维卷积层和全局最大池化层来提取特征,最后通过一个密集层进行分类。在模型构建完成后,我们使用训练数据进行训练。需要注意的是,由于我们使用了预训练的词向量,因此将 `trainable` 参数设置为 `False`,以避免再次训练词向量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值