单通道合并为三通道输入resnet网络

我们在做多序列任务时,一个患者会有多个序列的图像,每个序列的图像都是1通道的灰度图像,我们可以把一个患者的多有序列合并为多通道输入网络,这里举个3序列的例子。

1.输入之前合并

在输入之前将三张1通道合并为3通道图像,然后设置了参数chunk为3,意思就是将输入的通道拆分为3份,每一份进行网络中卷积后, 再将三个卷积后的特征进行拼接。有点类似D-W卷积。

import torch
import torch.nn as nn
import torchvision.models as models


class CustomResNet50(nn.Module):
    def __init__(self,  in_channels=1,num_classes=2, chunk=3):
        super(CustomResNet50, self).__init__()
        self.chunk = chunk
        # 加载预训练的ResNet-50模型
        resnet = models.resnet50(pretrained=True)

        # 将修改后的模型赋值给自定义的ResNet-50网络
        self.model = resnet

        # 修改第一个卷积层的输入通道数
        self.model.conv1 = nn.Conv2d(in_channels, 64, kernel_size=7, stride=2, padding=3, bias=False)

        # 修改全连接层的输出特征数
        self.fc = nn.Linear(2048 * self.chunk, num_classes)


    def  cat(self,x):
        x = self.model.conv1(x)
        x = self.model.bn1(x)
        x = self.model.relu(x)
        x = self.model.maxpool(x)

        x = self.model.layer1(x)
        x = self.model.layer2(x)
        x = self.model.layer3(x)
        x = self.model.layer4(x)
        x = self.model.avgpool(x)
        x = torch.flatten(x, 1)
        return x


    def forward(self, x ):
        # 对输入的三通道图像进行分割
        self.data = []
        split_data = torch.split(x, 1, dim=1)
        for i in range(self.chunk):
            self.data.append(self.cat(split_data[i]))

        # 在全连接层之前进行拼接
        x = torch.cat(self.data, dim=1)


        # 全连接层输出
        output = self.fc(x)

        return output

if __name__ == '__main__':
    # 创建一个实例,并指定类别数
    net = CustomResNet50( in_channels=1,num_classes=2,chunk=3)

    # 输出网络结构
    print(net)
#
#
#
#     # 在输入数据上进行前向传播
#     input_data = torch.randn(64, 3, 224, 224)  # 假设输入数据尺寸为1x224x224
#     output = net(input_data)
#     print("前连接层特征尺寸:", output.size())

2.在输入网络中合并

输入的是一个字典,将三个序列的数据保存在字典中,从字典中读取每个序列的数据,然后进行网络卷积,三个序列卷积之后,再进行合并。这里的chunk主要是调整合并后的特征数,经线性层到分类数。并没有起到拆分的作用。

import torch
import torch.nn as nn
import torchvision.models as models


class CustomResNet50(nn.Module):
    def __init__(self,  in_channels=1,num_classes=2, chunk=3):
        super(CustomResNet50, self).__init__()
        self.chunk = chunk
        # 加载预训练的ResNet-50模型
        resnet = models.resnet50(pretrained=True)

        # 将修改后的模型赋值给自定义的ResNet-50网络
        self.model = resnet

        # 修改第一个卷积层的输入通道数
        self.model.conv1 = nn.Conv2d(in_channels, 64, kernel_size=7, stride=2, padding=3, bias=False)

        # 修改全连接层的输出特征数
        self.fc = nn.Linear(2048 * self.chunk, num_classes)


    def  cat(self,x):
        x = self.model.conv1(x)
        x = self.model.bn1(x)
        x = self.model.relu(x)
        x = self.model.maxpool(x)

        x = self.model.layer1(x)
        x = self.model.layer2(x)
        x = self.model.layer3(x)
        x = self.model.layer4(x)
        x = self.model.avgpool(x)
        x = torch.flatten(x, 1)
        return x


    def forward(self, x ):

        low_energy = x['LOW_ENERGY']
        high_energy = x['HIGH_ENERGY']
        enhance = x['ENHANCE']

        low_energy = self.cat(low_energy)
        high_energy = self.cat(high_energy)
        enhance = self.cat(enhance)
        # # 对输入的三通道图像进行分割
        # self.data = []
        # split_data = torch.split(x, 1, dim=1)
        # for i in range(self.chunk):
        #     self.data.append(self.cat(split_data[i]))

        # 在全连接层之前进行拼接
        x = torch.cat((low_energy,high_energy,enhance), dim=1)

        # 全连接层输出
        output = self.fc(x)

        return output

if __name__ == '__main__':
    # 创建一个实例,并指定类别数
    net = CustomResNet50( in_channels=1,num_classes=2,chunk=3)

    # 输出网络结构
    # print(net)


    #
    # # 在输入数据上进行前向传播
    # input_data = torch.randn(64, 3, 224, 224)  # 假设输入数据尺寸为1x224x224
    # output = net(input_data)
    # print("前连接层特征尺寸:", output.size())

    input_data = {'LOW_ENERGY':torch.randn(64,1, 224, 224) ,
                  'HIGH_ENERGY': torch.randn(64,1, 224, 224),
                  'ENHANCE': torch.randn(64,1, 224, 224),
                  } # 假设输入数据尺寸为1x224x224
    output = net(input_data)
    print("前连接层特征尺寸:", output.size())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/595573.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

知识库工具:付费的HelpLook AI知识库比免费的牵牛易帮好在哪里

在知识管理的领域中,选择合适的知识库工具对于企业来说很重要。市面上有很多知识库产品,有付费的和免费的,但是还是有很多企业会选择使用付费的,而不是免费的。这是为什么呢?这就是今天要探讨的问题,下面就…

vs配置cplex12.10

1.创建c空项目 2.修改运行环境 为release以及x64 3.创建cpp文件 4.鼠标右键点击项目中的属性 5.点击c/c,点击第一项常规,配置附加库目录 5.添加文件索引,主要用于把路径导进来 6.这一步要添加的目录与你安装的cplex的目录有关系 F:\program…

idea2023.2.5的控制台动态配置当前环境

一、idea2023.2.5的控制台动态配置当前环境 1.1、idea版本 1.2、配置方式 1.2.1、方式一 1.2.2、方式二 1.3、参考 https://blog.csdn.net/xiaoheihai666/article/details/127757658

举个栗子!Minitab 技巧(8):用 PLS 偏最小二乘分析大豆脂肪影响因素

在上一个 🌰 中,我们用 Minitab 最小二乘法验证了两个变量(单位桶数与运输时间)之间是否存在某种关系。那么,在更复杂的场景中,如何验证一组预测变量和一个或多个连续响应变量之间的关系? 假设…

Pandas入门篇(三)-------数据可视化篇2(pandas-plot篇)

目录 概述一、格式1. 生成pandas.plotting对象来生成图表2. 调用plot()函数来生成图表3.支持的图表类型 二、单变量绘图常用图表1. 柱状图(bar)使用场景代码实现 2. 折线图(line)(默认即为折线图)适用场景代…

体育老师工资高吗,奖金有吗

教师的薪资水平与多种因素相关,包括教育经验、工作地点、学校类型以及个人的教学成果等。在讨论体育教师的工资问题时,不能仅仅关注数字,更应了解教育价值和个人发展。 初中体育教师的工资水平受多种因素影响。根据网络统计的数据&#xff0c…

[Spring Cloud] (6)gateway整体加解密

文章目录 简述整体效果后端增加配置nacos增加配置GlobalConfig 添加请求整体解密拦截器DecryptionFilter添加响应整体解密拦截器EncryptionFilter 前端请求拦截器添加整体加密逻辑请求头中添加sessionId 响应拦截器添加整体解密逻辑 简述 本文网关gateway,微服务&a…

阅读欣赏推荐之(七)——纪录片《一根绳子有多长》

《一根绳子有多长》是英国广播公司(BBC)在2009年出品的纪录片,这部纪录片以一跟绳子作为主角,通过运用现代科技手段,结合历史学、文化学、物理学等多个领域的知识,对绳子进行了全方位的研究。在古代&#x…

诺基亚贝尔探访上海斯歌,共探创新合作新机遇

近日,上海斯歌K2 BPM迎来重要客户考察交流活动。来自诺基亚贝尔的首席数字官刘少勇一行莅临了上海斯歌K2 BPM 的武汉研发中心,并对上海斯歌在BPM业务流程管理领域的研发成果及交付能力给予了高度肯定。 此次活动不仅加深了双方的战略合作,也为…

flask 前后台文件多张图片api;streamlit、gradio多图片页面展示

1、flask 前后台文件多张图片api send_file 传递zip: send_file(zip_data, mimetype‘application/zip’, as_attachmentTrue, download_name‘images.zip’) from flask import Flask, Response, request,send_file from PIL import Image import torch import i…

数据库大作业——基于qt开发的图书管理系统 (一)环境的配置与项目需求的分析

前言 博主最近数据库原理结课要做课程设计了,要求开发基于数据库实现的图书管理系统,博主想了想决定做一个基于Qt的图书管理系统,博主在此之前其实也没有用过多少Qt,仅以此专栏记录博主学习与开发的全过程,大家一起学习,一起进步…

使用固定公网地址远程访问开源服务器运维管理面板1Panel管理界面

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器,包括主机监控、…

npm install 会报错npm audit错误,会提示你有多少个漏洞需要结局等

npm install 会报错 npm audit… 错误,会提示你有多少个漏洞需要结局,对应的包版本不应该低于多少等等问题 当使用npm i 命令的时候会出现以下问题 如果是个新手的话,建议直接关闭npm的audit检查。这样可以保证npm的audit不会影响你的初始…

文献速递:深度学习医学影像心脏疾病检测与诊断--从SPECT/CT衰减图中深度学习冠状动脉钙化评分提高了对重大不良心脏事件的预测

Title 题目 Deep Learning Coronary Artery Calcium Scores from SPECT/CT Attenuation Maps Improve Prediction of Major Adverse Cardiac Events 从SPECT/CT衰减图中深度学习冠状动脉钙化评分提高了对重大不良心脏事件的预测 01 文献速递介绍 低剂量非门控CT衰减校正&am…

ASP.NET网络商店销售管理系统的设计与实现

摘 要 随着软件技术的不断进步和发展,信息化的管理方式越来越广泛的应用于各个领域,对于任何网站系统的管理来说开发一套现代化的成员管理软件是十分必要的。通过这样的软件系统,可以做到成员的规范管理和快速查询,从而减少管理…

TPV-W5 24V 48V 系列——正负双输出和单输出,工业级环境温度,用于PCB安装的国际标准结构

TPV-W5系列提供正负双输出和单输出,工业级环境温度,用于PCB安装的国际标准结构。此系列产品小巧,效率高,低输出纹波及能承受3000V以上的耐压,用于需要正负电压或单输出和高隔离电压的场合。封装有SIP和DIP可选。

JAVA基础之线程池原理与源码简读

线程 线程是调度CPU资源的最小单位,线程模型分为KLT和ULT模型,JVM使用的KLT模型java线程与OS线程保持1:1的映射关系,也就是说每一个java线程对应操作系统一个线程。Java线程有以下几种生命状态: NEW:新建状态RUNNABL…

单调栈|503.下一个更大元素II

力扣题目链接 class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {// 拼接一个新的numsvector<int> nums1(nums.begin(), nums.end());nums.insert(nums.end(), nums1.begin(), nums1.end());// 用新的nums大小来初始化resu…

我独自升级崛起在哪下载 我独自升级电脑PC端下载教程分享

将于5月8日在全球舞台闪亮登场的动作角色扮演游戏《我独自升级崛起》&#xff0c;灵感源自同名热门动画与网络漫画&#xff0c;承诺为充满激情的游戏玩家群体带来一场集深度探索与广阔体验于一身的奇幻旅程。该游戏以独特的网络武侠世界观为基底&#xff0c;展现了一位普通人踏…

[Java、Android面试]_22_APP启动流程(中频问答)

欢迎查看合集&#xff1a; Java、Android面试高频系列文章合集 本人今年参加了很多面试&#xff0c;也有幸拿到了一些大厂的offer&#xff0c;整理了众多面试资料&#xff0c;后续还会分享众多面试资料。 整理成了面试系列&#xff0c;由于时间有限&#xff0c;每天整理一点&am…