深度学习模型:Pytorch搭建ResNet、DenseNet网络,完成一维数据分类任务

news2025/1/27 12:59:21

2023.7.17

DenseNet和ResNet都是深度学习中常用的网络结构,它们各有优缺点。

DenseNet的优点是可以充分利用网络中的信息,因为每个层都可以接收来自前面所有层的信息。这种密集连接的结构可以提高网络的准确性,减少过拟合的风险。此外,DenseNet的参数量比ResNet少,训练速度更快。

ResNet的优点是可以解决深度网络中的梯度消失问题,使得网络可以更深更复杂。ResNet的残差结构可以让信息直接从前面的层传递到后面的层,避免了信息的丢失,提高了网络的准确性。此外,ResNet的结构简单,易于理解和实现。

DenseNet和ResNet的缺点也有所不同。DenseNet的缺点是需要更多的内存和计算资源,因为每个层都需要接收来自前面所有层的信息。此外,DenseNet的结构较为复杂,不易于理解和实现。

ResNet的缺点是在某些情况下可能会出现过拟合的问题,因为残差结构可以让信息直接从前面的层传递到后面的层,可能会导致网络过于复杂,难以泛化。

一、数据集的处理:

训练集、验证集、测试集的划分:

数据会被整理为.txt:(例如形成的trian.txt)

                最后会分割为trian_data.txt和train_labels.txt两个文件 

import os
import numpy as np
import random
import math



def normalization(data):  # 归一化:均值0,方差1
    data = (data - data.mean()) / data.std()
    return data


def random_rowl(data):  # 把行的顺序随机排列
    idx = np.arange(data.shape[0])
    np.random.shuffle(idx)
    data = data[idx[0:]]
    return data


def getfilelist(path):  # 读取文件夹下所有txt文件
    filelist = []
    for filename in os.listdir(path):
        if os.path.splitext(filename)[1] == '.txt':
            filelist.append(filename)
    random.shuffle(filelist)  # 随机打乱文件列表里的顺序
    return filelist


path = '第一类数据的文件夹子路径','第二类数据的文件夹子路径','第三类数据的文件夹子路径'

sort_num = 3  # 一共多少类?

for i in range(sort_num):  # 个数修改为路径的数目,与文件夹个数相同
    fileName = "{}/".format(path[i])
    files = getfilelist(fileName)
    # files=getfilelist(path[i]+'/')
    a = len(files)
    print(path[i], a)
    data = np.loadtxt(fileName + files[0])[:, 1]
    data = normalization(data)
    for j in range(1, a):
        data1 = np.loadtxt(fileName + '/' + files[j])[:, 1]
        data1 = normalization(data1)
        data = np.c_[data, data1]
    data = data.T

    # 加标签
    label = np.zeros((len(data), sort_num))  # 标签也改为分类的数目,与文件夹个数相同

    for m in range(len(label)):
        label[m, i] = 1
    data = np.c_[data, label]
    data = random_rowl(data)

    t = math.floor(len(data) * 0.7)

    v = math.floor(len(data) * 0.2)
    train = data[:t, :]
    val = data[t:(t + v), :]
    test = data[(t + v):, :]

    np.savetxt(path[i] + '_train.txt', train, fmt='%.6f')
    np.savetxt(path[i] + '_val.txt', val, fmt='%.6f')
    np.savetxt(path[i] + '_test.txt', test, fmt='%.6f')

train = np.loadtxt(path[0] + '_train.txt')
val = np.loadtxt(path[0] + '_val.txt')
test = np.loadtxt(path[0] + '_test.txt')

for i in range(1, sort_num):  # 需要修改为与分类个数相同,最后一个数与文件夹
    train1 = np.loadtxt(path[i] + '_train.txt')
    val1 = np.loadtxt(path[i] + '_val.txt')
    test1 = np.loadtxt(path[i] + '_test.txt')

    train = random_rowl(np.r_[train, train1])
    val = random_rowl(np.r_[val, val1])
    test = random_rowl(np.r_[test, test1])

np.savetxt('train.txt', train, fmt='%.6f') # 划分训练集
np.savetxt('val.txt', val, fmt='%.6f')  # 划分验证集
np.savetxt('test.txt', test, fmt='%.6f')  # 划分测试集


# 从train.txt、val.txt、test.txt中分别获取数据和标签

class_num = sort_num  # 分类的类数 

train_labels = np.loadtxt('./train.txt')[:, -class_num:]
test_labels = np.loadtxt('./test.txt')[:, -class_num:]
val_labels = np.loadtxt('./val.txt')[:, -class_num:]

train_data = np.loadtxt('./train.txt')[:, :-class_num]
test_data = np.loadtxt('./test.txt')[:, :-class_num]
val_data = np.loadtxt('./val.txt')[:, :-class_num]

np.savetxt('train_data.txt', train_data, fmt='%.6f')
np.savetxt('val_data.txt', val_data, fmt='%.6f')
np.savetxt('test_data.txt', test_data, fmt='%.6f')

np.savetxt('train_labels.txt', train_labels, fmt='%d')
np.savetxt('val_labels.txt', val_labels, fmt='%d')
np.savetxt('test_labels.txt', test_labels, fmt='%d')

二、数据的训练:

ResNet:

import numpy as np
import torch.optim as optim
import torch.nn as nn

import torch
from torch.utils.data import DataLoader, Dataset


class Bottlrneck(torch.nn.Module):
    def __init__(self, In_channel, Med_channel, Out_channel, downsample=False):
        super(Bottlrneck, self).__init__()
        self.stride = 1
        if downsample == True:
            self.stride = 2

        self.layer = torch.nn.Sequential(
            torch.nn.Conv1d(In_channel, Med_channel, 1, self.stride),
            torch.nn.BatchNorm1d(Med_channel),
            torch.nn.ReLU(),
            torch.nn.Conv1d(Med_channel, Med_channel, 3, padding=1),
            torch.nn.BatchNorm1d(Med_channel),
            torch.nn.ReLU(),
            torch.nn.Conv1d(Med_channel, Out_channel, 1),
            torch.nn.BatchNorm1d(Out_channel),
            torch.nn.ReLU(),
        )

        if In_channel != Out_channel:
            self.res_layer = torch.nn.Conv1d(In_channel, Out_channel, 1, self.stride)
        else:
            self.res_layer = None

    def forward(self, x):
        if self.res_layer is not None:
            residual = self.res_layer(x)
        else:
            residual = x
        return self.layer(x) + residual


class ResNet(torch.nn.Module):
    def __init__(self, in_channels=2, classes=6):
        super(ResNet, self).__init__()
        self.features = torch.nn.Sequential(
            torch.nn.Conv1d(in_channels, 64, kernel_size=7, stride=2, padding=3),
            torch.nn.MaxPool1d(3, 2, 1),

            Bottlrneck(64, 64, 256, False),
            Bottlrneck(256, 64, 256, False),
            Bottlrneck(256, 64, 256, False),
            #
            Bottlrneck(256, 128, 512, True),
            Bottlrneck(512, 128, 512, False),
            Bottlrneck(512, 128, 512, False),
            Bottlrneck(512, 128, 512, False),
            #
            Bottlrneck(512, 256, 1024, True),
            Bottlrneck(1024, 256, 1024, False),
            Bottlrneck(1024, 256, 1024, False),
            Bottlrneck(1024, 256, 1024, False),
            Bottlrneck(1024, 256, 1024, False),
            Bottlrneck(1024, 256, 1024, False),
            #
            Bottlrneck(1024, 512, 2048, True),
            Bottlrneck(2048, 512, 2048, False),
            Bottlrneck(2048, 512, 2048, False),

            torch.nn.AdaptiveAvgPool1d(1)
        )
        self.classifer = torch.nn.Sequential(
            torch.nn.Linear(2048, classes)
        )

    def forward(self, x):
        x = torch.Tensor.view(x, (-1, 2, 511))
        x = self.features(x)
        x = x.view(-1, 2048)
        x = self.classifer(x)
        return x


class MyDataset(Dataset):
    def __init__(self, raman_dir, label_file):
        self.raman_dir = np.loadtxt(raman_dir)
        self.label_file = np.loadtxt(label_file)
        self.raman_data = []
        self.label_list = []
        for index in self.raman_dir:
            self.raman_data.append(index)

        for index in self.label_file:
            self.label_list.append(index)

    def __getitem__(self, idx):
        raman = torch.Tensor(self.raman_data[idx])
        label = torch.Tensor(self.label_list[idx])
        label = np.argmax(label)

        return raman, label

    def __len__(self):
        # 获取数据集的长度
        return len(self.label_list)


if __name__ == '__main__':
    # 准备数据集
    train_data = './train_data.txt'
    val_data = './val_data.txt'
    
    # 标签
    train_label = './train_labels.txt'
    val_label = './val_labels.txt'

    # 创建数据加载器
    batch_size = 128
    # 训练集输入
    train_dataset = MyDataset(train_data, train_label)
    train_dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
    # 测试集输入
    test_dataset = MyDataset(test_data, test_label)
    test_dataloader = DataLoader(test_dataset, batch_size=batch_size, shuffle=True)
    # 验证集输入
    val_dataset = MyDataset(val_data, val_label)
    val_dataloader = DataLoader(val_dataset, batch_size=batch_size, shuffle=True)

    train_data_size = len(train_dataset)
    val_data_size = len(val_dataset)

    # 创建网络模型
    class_num = 6
    test_data_length = 600
    ResNetOutput = ResNet(in_channels=2, classes=class_num).cuda()

    # 定义损失函数
    loss_fn = nn.CrossEntropyLoss().cuda()

    # 定义优化器
    learning_rate = 0.00001
    optimizer = optim.Adam(ResNetOutput.parameters(), lr=learning_rate)

    # 记录验证的次数
    total_train_step = 0
    total_val_step = 0

    # 训练
    epoch = 100
    acc_list = np.zeros(epoch)
    print("{0:-^27}".format('Train_Model'))
    for i in range(epoch):
        print("----------epoch={}----------".format(i + 1))
        ResNetOutput.train()
        for data in train_dataloader:  # data 是batch大小
            raman_train_data, t_labels = data
            raman_train_data = raman_train_data.cuda()
            t_labels = t_labels.cuda()
            output = ResNetOutput(raman_train_data)
            loss = loss_fn(output, t_labels)

            # 优化器优化模型
            optimizer.zero_grad()  # 梯度清零
            loss.backward()  # 反向传播
            optimizer.step()  # 优化更新参数

            total_train_step = total_train_step + 1
            print("train_times:{},Loss:{}".format(total_train_step, loss.item()))

        # 测试步骤开始
        ResNetOutput.eval()
        total_val_loss = 0
        total_accuracy = 0
        with torch.no_grad():  # 测试的时候不需要对梯度进行调整,所以梯度设置不调整
            for data in val_dataloader:
                raman_val_data, v_labels = data
                raman_val_data = raman_val_data.cuda()
                v_labels = v_labels.cuda()
                outputs = ResNetOutput(raman_val_data)
                loss = loss_fn(outputs, v_labels)
                total_val_loss = total_val_loss + loss.item()  # 计算损失值的和
                accuracy = 0

                for j in v_labels:

                    if outputs.argmax(1)[j] == v_labels[j]:
                        accuracy = accuracy + 1

                # accuracy = (outputs.argmax(1) == v_labels).sum()  # 计算一个数据的精确度
                total_accuracy = total_accuracy + accuracy

        val_acc = float(total_accuracy / 1440) * 100
        acc_list[i] = val_acc
        print('the_classification_is_correct :', total_accuracy)  # 正确分类的个数
        print("val_Loss:{}".format(total_val_loss))
        print("val_acc:{}".format(float(total_accuracy / 1440) * 100), '%')

        total_val_step += 1
        torch.save(ResNetOutput, "ResNet_{}.pth".format(i))
        # torch.save(ResNetOutput.state_dict(), "ResNet_{}.pth".format(i))
        print("{0:-^24}".format('Model_Save'), '\n')
        print('val_max=', max(acc_list), '%')

注意!在代码的75行:

x = torch.Tensor.view(x, (-1, 2, 511))  # 511的位置要根据自己的数据集形状调整

DenseNet:

import numpy as np
import torch.optim as optim
import torch.nn as nn

import torch
from torch.utils.data import DataLoader, Dataset


class DenseLayer(torch.nn.Module):
    def __init__(self, in_channels, middle_channels=128, out_channels=32):
        super(DenseLayer, self).__init__()
        self.layer = torch.nn.Sequential(
            torch.nn.BatchNorm1d(in_channels),
            torch.nn.ReLU(inplace=True),
            torch.nn.Conv1d(in_channels, middle_channels, 1),
            torch.nn.BatchNorm1d(middle_channels),
            torch.nn.ReLU(inplace=True),
            torch.nn.Conv1d(middle_channels, out_channels, 3, padding=1)
        )

    def forward(self, x):
        return torch.cat([x, self.layer(x)], dim=1)


class DenseBlock(torch.nn.Sequential):
    def __init__(self, layer_num, growth_rate, in_channels, middele_channels=128):
        super(DenseBlock, self).__init__()
        for i in range(layer_num):
            layer = DenseLayer(in_channels + i * growth_rate, middele_channels, growth_rate)
            self.add_module('denselayer%d' % (i), layer)


class Transition(torch.nn.Sequential):
    def __init__(self, channels):
        super(Transition, self).__init__()
        self.add_module('norm', torch.nn.BatchNorm1d(channels))
        self.add_module('relu', torch.nn.ReLU(inplace=True))
        self.add_module('conv', torch.nn.Conv1d(channels, channels // 2, 3, padding=1))
        self.add_module('Avgpool', torch.nn.AvgPool1d(2))


class DenseNet(torch.nn.Module):
    def __init__(self, layer_num=(6, 12, 24, 16), growth_rate=32, init_features=64, in_channels=1, middele_channels=128,
                 classes=6):
        super(DenseNet, self).__init__()
        self.feature_channel_num = init_features
        self.conv = torch.nn.Conv1d(in_channels, self.feature_channel_num, 7, 2, 3)
        self.norm = torch.nn.BatchNorm1d(self.feature_channel_num)
        self.relu = torch.nn.ReLU()
        self.maxpool = torch.nn.MaxPool1d(3, 2, 1)
        # self.attention = SpatialAttention(64)  # 空间注意力机制

        self.DenseBlock1 = DenseBlock(layer_num[0], growth_rate, self.feature_channel_num, middele_channels)
        self.feature_channel_num = self.feature_channel_num + layer_num[0] * growth_rate
        self.Transition1 = Transition(self.feature_channel_num)

        self.DenseBlock2 = DenseBlock(layer_num[1], growth_rate, self.feature_channel_num // 2, middele_channels)
        self.feature_channel_num = self.feature_channel_num // 2 + layer_num[1] * growth_rate
        self.Transition2 = Transition(self.feature_channel_num)

        self.DenseBlock3 = DenseBlock(layer_num[2], growth_rate, self.feature_channel_num // 2, middele_channels)
        self.feature_channel_num = self.feature_channel_num // 2 + layer_num[2] * growth_rate
        self.Transition3 = Transition(self.feature_channel_num)

        self.DenseBlock4 = DenseBlock(layer_num[3], growth_rate, self.feature_channel_num // 2, middele_channels)
        self.feature_channel_num = self.feature_channel_num // 2 + layer_num[3] * growth_rate

        self.avgpool = torch.nn.AdaptiveAvgPool1d(1)

        self.classifer = torch.nn.Sequential(
            torch.nn.Linear(self.feature_channel_num, self.feature_channel_num // 2),
            torch.nn.ReLU(),
            torch.nn.Dropout(0.5),
            torch.nn.Linear(self.feature_channel_num // 2, classes),

        )

    def forward(self, x):
        x = torch.Tensor.view(x, (-1, 1, 1022))  # 第一个参数是batch_size
        x = x.resize_as_(x.to(torch.float32))
        x = self.conv(x)
        x = self.norm(x)  # 正则化
        x = self.relu(x)
        x = self.maxpool(x)
        x = self.DenseBlock1(x)
        x = self.Transition1(x)
        x = self.DenseBlock2(x)
        x = self.Transition2(x)
        x = self.DenseBlock3(x)
        x = self.Transition3(x)
        x = self.DenseBlock4(x)
        x = self.avgpool(x)
        x = x.view(-1, self.feature_channel_num)
        x = self.classifer(x)

        return x


class MyDataset(Dataset):  # 利用Pytorch的内置函数加载数据
    def __init__(self, raman_dir, label_file):
        self.raman_dir = np.loadtxt(raman_dir)
        self.label_file = np.loadtxt(label_file)
        self.raman_data = []
        self.label_list = []
        for index in self.raman_dir:
            self.raman_data.append(index)

        for index in self.label_file:
            self.label_list.append(index)

    def __getitem__(self, idx):
        raman = torch.Tensor(self.raman_data[idx])
        label = torch.Tensor(self.label_list[idx])
        label = np.argmax(label)

        return raman, label

    def __len__(self):
        # 获取数据集的长度
        return len(self.label_list)


if __name__ == '__main__':
    # 准备数据集
    train_data = './train_data.txt'
    val_data = './val_data.txt'
    

    # 标签
    train_label = './train_labels.txt'

    val_label = './val_labels.txt'

    # 数据长度
    test_data_length = 600
    val_data_length = 1440

    # 分类的类别
    class_num = 6  # 注意调整58行的函数中的class(分类类别)

    # 学习率
    learning_rate = 0.00001
    # 批处理大小
    batch_size = 128

    # 数据加载器
    train_dataset = MyDataset(train_data, train_label)
    train_dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)

    test_dataset = MyDataset(test_data, test_label)
    test_dataloader = DataLoader(test_dataset, batch_size=batch_size, shuffle=True)

    val_dataset = MyDataset(val_data, val_label)
    val_dataloader = DataLoader(val_dataset, batch_size=batch_size, shuffle=True)

    train_data_size = len(train_dataset)
    val_data_size = len(val_dataset)

    # 创建网络模型
    DenseNetOutput = DenseNet().cuda()  # .Cuda()数据是指放到GPU上

    # 定义损失函数
    loss_fn = nn.CrossEntropyLoss().cuda()  # 交叉熵函数

    # 定义优化器
    optimizer = optim.Adam(DenseNetOutput.parameters(), lr=learning_rate)

    # 记录验证的次数
    total_train_step = 0
    total_val_step = 0
    writer = SummaryWriter("logs_train")  # 记录训练的权重

    # 训练
    epoch = 30  #
    acc_list = np.zeros(epoch)
    print("{0:-^27}".format('Train_Model'))
    for i in range(epoch):
        print("----------epoch={}----------".format(i + 1))
        DenseNetOutput.train()
        for data in train_dataloader:  # data 是batch大小
            raman_train_data, t_labels = data
            raman_train_data = raman_train_data.cuda()
            t_labels = t_labels.cuda()
            output = DenseNetOutput(raman_train_data)
            loss = loss_fn(output, t_labels)

            # 优化器优化模型
            optimizer.zero_grad()  # 梯度清零
            loss.backward()  # 反向传播
            optimizer.step()  # 优化更新参数

            total_train_step = total_train_step + 1
            print("train_times:{},Loss:{}".format(total_train_step, loss.item()))

        # 测试步骤开始
        DenseNetOutput.eval()
        total_val_loss = 0
        total_accuracy = 0
        with torch.no_grad():  # 测试的时候不需要对梯度进行调整,所以梯度设置不调整
            for data in val_dataloader:
                raman_val_data, v_labels = data
                raman_val_data = raman_val_data.cuda()
                v_labels = v_labels.cuda()
                outputs = DenseNetOutput(raman_val_data)
                loss = loss_fn(outputs, v_labels)
                total_val_loss = total_val_loss + loss.item()  # 计算损失值的和
                accuracy = 0

                for j in v_labels:  # 计算精确度的和

                    if outputs.argmax(1)[j] == v_labels[j]:
                        accuracy = accuracy + 1

                # accuracy = (outputs.argmax(1) == v_labels).sum()  # 计算一个数据的精确度
                total_accuracy = total_accuracy + accuracy

        val_acc = float(total_accuracy / val_data_size) * 100
        acc_list[i] = val_acc  # 记录验证集的正确率
        print('the_classification_is_correct :', total_accuracy, val_data_length)
        print("val_Loss:{}".format(total_val_loss))
        print("val_acc:{}".format(val_acc), '%')
        
        total_val_step += 1
        torch.save(DenseNetOutput, "DenseNet_{}.pth".format(i + 1))
        print("{0:-^24}".format('Model_Saved'), '\n')

        print('val_max=', max(acc_list), '%')  # 验证集的最高正确率

注意!在代码的93行:

x = torch.Tensor.view(x, (-1, 1, 1022))  # 1022的位置要根据自己的数据集大小取调整 

测试代码:

import torch
import numpy as np
from ResNet import Bottlrneck, ResNet

# from DenseNet_SpatialAttention import DenseNet, DenseLayer, DenseBlock

device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')  # 判断是否有GPU

test_data = np.loadtxt('./test_data.txt')  # 测试集的路径

model = ResNet().to(device)
model.load_state_dict(torch.load('ResNet_100.pth'))  # 加载模型

# model = DenseNet().to(device)
# model.load_state_dict(torch.load('DenseNet_100.pth'))  # 加载模型

test_length = test_data.shape[0]

for i in range(test_length):
    td = torch.from_numpy(test_data[i]).float().to(device)
    Predict_output = model(td).to(device)

    _, predicted = Predict_output.max(1)
    pred_type = predicted.item()
    print('pred_type:', pred_type)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

教你一招,动态规划思想

动态规划 什么是动态规划? 动态规划也是算法设计的一种方法/思想。它将一个问题分解为相互重叠的子问题,通过反复求解子问题,来解决原来的问题。 基础案例 场景一 斐波那契数列 当前数等于前面两个数的和。 定义子问题:f(n)…

Python异步网络编程框架Twisted使用方法

Twisted概念 Twisted是一个Python异步网络编程框架,它可以帮助我们开发高性能的网络应用程序。它提供了一些基本概念,如reactor、protocol、transport和factory等,用于构建高效的网络应用程序。 优点: 异步并发处理&#xff1a…

Ceph集群

目录 一、存储概述 1.单机存储设备 1.1 DAS 1.2 NAS 1.3 SAN 2. 单机存储的问题 3. 商业存储解决方案 4.分布式存储(软件定义的存储 SDS) 4.1 分布式存储的类型 二、Ceph简介 1.Ceph 优势 2. Ceph 架构 2.1 RADOS 基础存储系统 2.2 LIBRADOS…

Arch - 多线程设计架构模式

文章目录 概述细节 概述 多线程设计架构模式是一种通过合理地使用线程来提高系统性能和响应能力的设计模式。以下是一些常见的多线程设计架构模式: 线程池模式:通过预先创建一组线程,将任务提交到线程池中执行,避免了线程的频繁创…

Perforce Helix Core新版本推出资源压力感知功能,提升服务器可用性,助力大规模开发

您的版本控制系统帮助团队进行主动监控吗? Perforce Helix Core的客户经常在不同维度上测试规模和性能的极限。其中一些维度包括文件数量、文件大小、用户数和并发事务数量。随着这些维度的压力增加,服务器资源(如内存和CPU)通常…

时刻领先丨PingCAP 用户峰会 2023 圆满收官

7 月 13 日,PingCAP 用户峰会 2023 在北京西南华邑酒店成功举办。 大会有哪些精彩看点,快跟小编来看看吧! 提升中国开源数据库在国际市场的影响力和竞争力 倪光南 中国工程院院士 在全球数字科技创新的浪潮中,数据库作为核心数…

EVO 工具常见使用记录

计算ATE 第一种 evo_ape tum GT_robot_0.txt robot0_estimated.txt --plot --plot_mode xyz --align_origin第二种 evo_ape tum GT_robot_0.txt robot0_estimated.txt --plot --plot_mode xyz -a参数解析 GT pose 跟 estimated pose 文件的相对顺序。先 GT pose 的文件…

Boojum:zkSync的高性能去中心化STARK证明系统

1. 引言 2023年7月17日zkSync官方twitter Say hello to Boojum宣称在不regenesis的情况下,将zkSync Era迁移至Boojum证明系统。 Boojum为STARK证明系统(PlonkFRI),开源代码见: https://github.com/matter-labs/era-…

【kubernetes系列】Kubernetes之调度器和调度过程

Kubernetes之调度器和调度过程 概述 当用户请求向API server创建新的Pod时,API server检查授权、权限等没有任何问题的话,他会把这个请求交由Scheduler,由Scheduler检查所有符合该Pod要求的列表,开始执行Pod调度逻辑&#xff0c…

mongdb基本操作

如果要查看刚刚创建的数据库 创建集合class 将数据插入 进行查找练习 查看班级所有人信息 db.class.find()查看班级中年龄为10岁的学生信息 db.class.find({age:10})查看年龄大于10岁的学生信息 用到范围条件查询 db.class.find({age:{$gt:10}})查看年龄在 4—8岁之间的学…

Jetpack入门:DataBinding

目录 一、DataBinding简介 设置 Data Binding 数据绑定表达式 双向绑定 二、例子 例1:DataBinding实现文本绑定和点击事件 MainActivity : CountStart : Food: OnClickListener : activity_main: build.gradle: 运行结果…

用vscode远程连接Linux服务器后,如何创建自己的账号

1. 打开终端(Terminal)窗口 2. 在终端中创建新的用户账号 (假设您要创建的用户名为 “newuser”),在命令执行期间,需要提供新用户的密码。按照提示进行操作。 先输入登录的管理员账号密码。 再输入创建的…

2.2 Entry Text输入,文本框

2.2 Entry & Text输入,文本框 窗口主体框架 每一个tkinter应用的主体框架都包含以下几部分: 主窗口: window,及主窗口的一些基本属性(标题、大小)让窗口活起来:window.mainloop() import tkinter as…

热插拔-udev机制

一、什么是udev? udev是一种设备管理工具,以“守护进程”的形式运行,通过侦听内核发出来的uevent来管理/dev目录下的设备文件。它能够根据系统中的硬件设备的状态动态更新设备文件,包括设备文件的创建,删除等。使用ud…

线程池学习(二)execute() 和 submit() 的区别

转载&#xff1a;线程池 线程提交的两种方式 ExecutorService poll3 Executors.newCachedThreadPool();for (int i 0; i < 2; i) {poll3.execute(new TargetTask());poll3.submit(new TargetTask());}execute方法 void execute(Runnable command): Executor接口中的方法s…

【3-D深度学习:肺肿瘤分割】创建和训练 V-Net 神经网络,并从 3D 医学图像中对肺肿瘤进行语义分割研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Dubbo框架保姆级教学[手把手教会你]

文章目录 Dubbo框架Dubbo(RPC)概括Dubbo支持的协议Dubbo支持的注册中心dubbo的调用结构 配置服务项目- 依赖- application-local.yml配置类注解- provider(服务提供者): 远程调用的被调用的服务实例- consumer(服务消费者): 远程调用的调用发起的服务实例 远程调用原理 Dubbo负…

34.Vue自定义指令-对象式

33.Vue自定义指令&#xff08;函数式&#xff09;_vue自定义函数_未来音律的博客-CSDN博客还有一种就是&#xff0c;我们去定义指令的时候&#xff0c;也不要去写v-前缀&#xff0c;定义指令的时候需要给指令起名字&#xff0c;那么这个指令的名字直接就叫big,而用的时候还是要…

基于linux下的高并发服务器开发(第二章)- 2.7 进程退出、孤儿进程、僵尸进程

01 / 进程退出 exit.c /*#include <stdlib.h>void exit(int status);#include <unistd.h>void _exit(int status);status参数&#xff1a;是进程退出时的一个状态信息。父进程回收子进程资源的时候可以获取到。 */ #include <stdio.h> #include <stdlib.…

青翼科技自主研发4路AD子卡FMC137

FMC137是一款基于VITA57.4标准规范的JESD204B接口FMC子卡模块&#xff0c;该模块可以实现4路14-bit、2GSPS/2.6GSPS/3GSPS ADC采集功能。该板卡ADC器件采用ADI公司的AD9208芯片&#xff0c;&#xff0c;与ADI公司的AD9689可以实现PIN脚兼容。该ADC与FPGA的主机接口通过16通道的…