生成对抗网络

目录

1.GAN的网络组成

2.损失函数解释说明

2.1 BCEloss

2.2整体代码


1.GAN的网络组成


2.损失函数解释说明

2.1 BCEloss

损失函数

import torch 
from torch import autograd

input =autograd.Variable(torch.tensor([[1.9072,1.1079,1.4906],
                                       [-0.6584,-0.0512,0.7608],
                                       [-0.0614,0.6583,0.1095]]),requires_grad=True)
#Variable已经被放弃使用了,因为tensor自己已经支持自动求导的功能了,只要把requires_grad
#属性设置成True就可以

print(input)
print('-'*100)
"""结果输出:
tensor([[ 1.9072,  1.1079,  1.4906],
        [-0.6584, -0.0512,  0.7608],
        [-0.0614,  0.6583,  0.1095]], requires_grad=True)"""

from torch import nn
m=nn.Sigmoid()
#开始有正有负的矩阵变成了0-1之间的正数
print(m(input))
print('-'*100)
"""结果输出:
tensor([[0.8707, 0.7517, 0.8162],
        [0.3411, 0.4872, 0.6815],
        [0.4847, 0.6589, 0.5273]], grad_fn=<SigmoidBackward0>)"""

target=torch.FloatTensor([[0,1,1],[1,1,1],[0,0,0]])
#将变量转化为浮点型32位,这里注意此时的变量类型为列表,或数组等,此时参数为单个变量
print(target)
print('-'*100)
"""结果输出:
tensor([[0., 1., 1.],
        [1., 1., 1.],
        [0., 0., 0.]])"""



X=X.flatten()
target=target.flatten()
print(X)
print(target)
print('-'*100)
"""结果输出:
tensor([0.8707, 0.7517, 0.8162, 0.3411, 0.4872, 0.6815, 0.4847, 0.6589, 0.5273],
       grad_fn=<ReshapeAliasBackward0>)
tensor([0., 1., 1., 1., 1., 1., 0., 0., 0.])"""


z=list(zip(target,X))
print(z)
print('-'*100)
"""结果输出:
[(tensor(0.), tensor(0.8707, grad_fn=<UnbindBackward0>)), (tensor(1.), tensor(0.7517,
 grad_fn=<UnbindBackward0>)), (tensor(1.), tensor(0.8162, grad_fn=<UnbindBackward0>)),
 (tensor(1.), tensor(0.3411, grad_fn=<UnbindBackward0>)), (tensor(1.), tensor(0.4872, 
grad_fn=<UnbindBackward0>)), (tensor(1.), tensor(0.6815, grad_fn=<UnbindBackward0>)), 
(tensor(0.), tensor(0.4847, grad_fn=<UnbindBackward0>)), (tensor(0.), tensor(0.6589, 
grad_fn=<UnbindBackward0>)), (tensor(0.), tensor(0.5273, grad_fn=<UnbindBackward0>))]"""


result=[]
for (a,b) in z:
    result.append(a*math.log(b)+(1-a)*math.log(1-b))
#a*math.log(b)就是预测正确的类别数,(1-a)*math.log(1-b)就是预测错误的类别数

result=torch.tensor(result)
r=result.reshape(3,3)
print(r)
print('-'*100)
"""结果输出:
tensor([[-2.0457, -0.2854, -0.2031],
        [-1.0756, -0.7191, -0.3834],
        [-0.6629, -1.0755, -0.7494]])"""

s=[]
for line in r:
    s.append(-(sum(line)/3))
print(s)
"""结果输出:
[tensor(0.8447), tensor(0.7260), tensor(0.8293)]
"""

bceloss=torch.tensor(s).sum()/3
print(bceloss)
"""结果输出:
tensor(0.8000)
"""
#以上是手动计算BCELoss的结果

下面是应用那nn.BCELossnn.BCEWithLogitsLoss的运算结果,和手动计算的结果一致。

他们两个函数的区别就是对输入做的变换不同,nn.BCELoss需要对输入做sigmoid()使输入变成[0,1]区间的数。而nn.BCEWithLogitsLoss()则是内嵌了sigmoid()操作。

import torch 
from torch import nn



input =torch.tensor([[1.9072,1.1079,1.4906],
                     [-0.6584,-0.0512,0.7608],
                    [-0.0614,0.6583,0.1095]],requires_grad=True)
#Variable已经被放弃使用了,因为tensor自己已经支持自动求导的功能了,只要把requires_grad
#属性设置成True就可以

print(input)
print('-'*100)


m=nn.Sigmoid()
#开始有正有负的矩阵变成了0-1之间的正数
print(m(input))
print('-'*100)

target=torch.FloatTensor([[0,1,1],[1,1,1],[0,0,0]])
#将变量转化为浮点型32位,这里注意此时的变量类型为列表,或数组等,此时参数为单个变量
print(target)
print('-'*100)


loss=nn.BCELoss()
print(loss(m(input),target))
print('-'*100)

#nn.BCEWithLogitsLoss()此损失函数将 Sigmoid 层和 BCELoss 整合在一起
loss=nn.BCEWithLogitsLoss()
print(loss(input,target))


"""结果输出:
tensor([[ 1.9072,  1.1079,  1.4906],
        [-0.6584, -0.0512,  0.7608],
        [-0.0614,  0.6583,  0.1095]], requires_grad=True)
------------------------------------------------------------------------
tensor([[0.8707, 0.7517, 0.8162],
        [0.3411, 0.4872, 0.6815],
        [0.4847, 0.6589, 0.5273]], grad_fn=<SigmoidBackward0>)
---------------------------------------------------------------------------
tensor([[0., 1., 1.],
        [1., 1., 1.],
        [0., 0., 0.]])
----------------------------------------------------------------------------
tensor(0.8000, grad_fn=<BinaryCrossEntropyBackward0>)
----------------------------------------------------------------------------
tensor(0.8000, grad_fn=<BinaryCrossEntropyWithLogitsBackward0>)
"""

PyTorch的Variable已经不需要用了!!!_rom torch.autograd import variable-CSDN博客

Pytorch数据类型转换(torch.tensor,torch.FloatTensor)_torch改变数据类型-CSDN博客

Pytorch常用损失函数nn.BCEloss();nn.BCEWithLogitsLoss();nn.CrossEntropyLoss();nn.L1Loss(); nn.MSELoss();_nn.bcewithlogitsloss(reduction="none")-CSDN博客

2.2整体代码

 

import argparse
import torch
import torch.nn as nn
import numpy as np
import os
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
from torchvision import datasets
from torchvision.utils import save_image


os.makedirs("images", exist_ok=True)
# makedirs()方法是递归目录创建功能。如果exists_ok为False(默认值),则如果目标目录
# 已存在,则引发OSError错误,True则不会

parser = argparse.ArgumentParser()
# 创建一个 ArgumentParser 对象,该对象包含将命令行输入内容解析成 Python 数据的过程所
# 需的全部功能。
parser.add_argument("--n_epochs", type=int, default=100, help="number of epochs of training")
# 添加需要输入的命令行参数,()中依次为参数名;参数类型,声明这个参数的数据类型为int
# 为了参与运算,默认数据类型为str;描述信息。参数名--n_epochs,类型为int,默认等于100
# 含义是用于训练的次数
parser.add_argument("--batch_size", type=int, default=128, help="size of the batches")
# 参数是批量大小,类型为int,默认批量大小为128,含义是批量大小
parser.add_argument("--lr", type=float, default=0.0002, help="adam: learning rate")
# 参数是学利率,默认是浮点型的0.0002,含义是Adam优化器的学习率
parser.add_argument("--b1", type=float, default=0.5, help="adam: decay of first order momentum of gradient")
# b1是adam优化器的一阶衰减梯度动量,大小为0.5的浮点数,可以说是adam公式里的β1,通常取值为0.9
parser.add_argument("--b2", type=float, default=0.999, help="adam: decay of first order momentum of gradient")
# b2是adam公式里的β2,大小为0.999的浮点数,通常β2取值为0.999
parser.add_argument("--n_cpu", type=int, default=8, help="number of cpu threads to use during batch generation")
# --n_cpu是在批处理生成期间要使用的 CPU 线程数,默认为8的整数
parser.add_argument("--latent_dim", type=int, default=100, help="dimensionality of the latent space ")
# latent_dim是潜空间的维数,有100维
parser.add_argument("--img_size", type=int, default=28, help="size of each image dimension ")
# img_siz是每张图片的尺寸,默认大小为28(28*28=784)
parser.add_argument("--channels", type=int, default=1, help="number of image channels")
# --channels 是每张图片的通道数等于1
parser.add_argument("--sample_interval", type=int, default=400, help="interval betwen image samples")
# sample_interval是图像示例之间的间隔等于400
opt = parser.parse_args()
# ArgumentParser 通过 parse_args() 方法解析参数,获取到命令行中输入的参数。存储到opt中
print(opt)

img_shape = (opt.channels, opt.img_size, opt.img_size)
# 输入图像的大小是1个通道,28*28大小的图片

cuda = True if torch.cuda.is_available() else False
# 返回一个bool,指示CUDA当前是否可用。,如果可用就返回cuda=True,不可用就返回cuda=False


"""定义生成器"""

class Generator(nn.Module):
    def __init__(self):
        super().__init__()

        def block(in_feat, out_feat, normalize=True):
            # 输入是28*28=784个像素点
            layers = [nn.Linear(in_feat, out_feat)]
            if normalize:
                # 如果要批归一化处理
                layers.append(nn.BatchNorm1d(out_feat, 0.8))
                # 输入维度,也就是数据的特征维度等于out_feat,momentum等于0.8
                # CLASStorch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1,
                # affine=True, track_running_stats=True, device=None, dtype=None)
            layers.append(nn.LeakyReLU(0.2, inplace=True))
            # LeakyReLU与relu的区别就是LeakyReLU把负区间从0变为了一定斜率的直线,0.2表示负半轴
            # 的斜率是0.2
            return layers

        self.model = nn.Sequential(
             *block(opt.latent_dim,128,normalize=False),
        # opt.latent_dim等于100,第一个块不需要批归一化
             *block(128, 256),
             *block(256, 512),
             *block(512, 1024),
             nn.Linear(1024, int(np.prod(img_shape))),
        # np.prod默认是把所有元素相乘,还可以指定数组的轴相乘
        # 这里也就是把输出变成了图片的像素点的大小即1*28*28=784
             nn.Tanh())

        # 将输出元素调整到区间(-1,1)内
    def forward(self, z):
        img = self.model(z)
        img = img.view(img.size(0), *img_shape)
            # 输出应该是批量*1*28*28
        return img

    """定义判别器"""

class Discriminator(nn.Module):
    def __init__(self):
        super().__init__()
        self.module = nn.Sequential(nn.Linear(int(np.prod(img_shape)), 512),
                                    nn.LeakyReLU(0.2, inplace=True),
                                    nn.Linear(512, 256),
                                    nn.LeakyReLU(0.2, inplace=True),
                                    nn.Linear(256, 1),
                                    nn.Sigmoid())
        # 最终的预测结果是0-1上的一个概率值,所以最后就只有1个结果
    def forward(self, img):
        img_flat = img.view(img.size(0), -1)
        # 先弄成线性的
        validity = self.module(img_flat)
        return validity

"""定义损失函数"""
adversarial_loss = torch.nn.BCELoss()

"""实例化生成器和辨别器"""
generator =Generator()
discriminator = Discriminator()

"""使用GPU计算"""
if cuda:
    generator.cuda()
    discriminator.cuda()
    adversarial_loss.cuda()
    # 把网络和损失函数都移到GPU上

"""配置数据集"""
os.makedirs("./data/mnist", exist_ok=True)
# 创建多层目录,os.makedirs(name, mode=0o777, exist_ok=False),如果exist_ok为False(默认
# 值),则在目标目录已存在的情况下触发FileExistsError异常;如果exist_ok为True,则在目标目录
# 已存在的情况下不会触发FileExistsError异常。
dataloader = torch.utils.data.DataLoader(
    # 将自定义的数据读取接口的输出或者PyTorch已有的数据读取接口的输入按照batch_size封装成Tensor
    # ,后续只需要再包装成Variable即可作为模型的输入。
    datasets.MNIST(
        # train_dataset = datasets.MNIST(root='./MNIST',train=True,transform=data_tf,download=True)
        # train=True 代表我们读入的数据作为训练集(如果为true则从training.pt创建数据集,否则从
        # test.pt创建数据集)。transform则是读入我们自己定义的数据预处理操作,download=True则是
        # 当我们的根目录(root)下没有数据集时,便自动下载。

        "./data/mnist",
        train=True,
        download=True,
        transform=transforms.Compose(
            # torchvision.transforms是pytorch中的图像预处理包。一般用Compose把多个步骤整合到一起
            [transforms.Resize(opt.img_size),
             # 把给定的图片resize到given size
             transforms.ToTensor(),
             # transforms.ToTensor()函数的作用是将原始的PILImage格式或者numpy.array格式的数据格式化
             # 为可被pytorch快速处理的张量类型。输入模式为(L、LA、P、I、F、RGB、YCbCr、RGBA、CMYK、1)
             # 的PIL Image 或 numpy.ndarray (形状为H x W x C)数据范围是[0, 255] 到一个
             # Torch.FloatTensor,其形状 (C x H x W) 在 [0.0, 1.0] 范围内。

             transforms.Normalize([0.5], [0.5])]),
        # 逐channel的对图像进行标准化(均值变为0,标准差变为1),可以加快模型的收敛
        # 将两个参数都设置为0.5并与transforms.ToTensor()一起使用可以使将数据强制缩放到[-1,1]区间上。
        # ,参数是0.5是通过区间化公式计算得出的。标准化只能保证大部分数据在0附近——3σ原则)
    ),
    batch_size=opt.batch_size,
    shuffle=True)

"""指定优化器"""
optimizer_G = torch.optim.Adam(generator.parameters(), lr=opt.lr, betas=(opt.b1, opt.b2))
optimizer_D = torch.optim.Adam(discriminator.parameters(), lr=opt.lr, betas=(opt.b1, opt.b2))

Tensor = torch.cuda.FloatTensor if cuda else torch.FloatTensor

"""训练"""
for epoch in range(opt.n_epochs):
    for i, (imgs, _) in enumerate(dataloader):

        valid = Tensor(imgs.size(0), 1).fill_(1.0)
        # torch.Tensor生成单精度浮点类型的张量。torch.tensor可以指定张量的类型。
        # imgs.size(0)是图像的行数,有多少行就表示有多少个样本,然后指定样本的标签是1
        # .fill_(1.0)将tensor中的所有值都填充为指定的1.0
        fake = Tensor(imgs.size(0), 1).fill_(0.0)
        # 真假标签的形状都是一个批量,把一个批量里面的标签填充成1或0

        real_imgs = imgs.type(Tensor)
        # 真实的图片转化为神经网络可以处理的变量

        """训练生成器"""
        optimizer_G.zero_grad()
        # 随机的初始化一个batch的向量
        z = Tensor(np.random.normal(0, 1, (imgs.shape[0], opt.latent_dim)))
        # 这部分就是在上面训练生成网络的z的输入值,np.random.normal(0, 1, (imgs.shape[0],
        # opt.latent_dim)的意思就是生成从0到1之间,形状为128*100的随机高斯数据,
        # 随机高斯数据。imgs.shape[0]就是批量的个数,比如说imgs.shape[0]是128,就是每一批是
        # 64张图片,后面的参数是100维,就是有这么多个特征

        # 生成一批量的图片
        gen_imgs = generator(z)
        # 生成了一批就是128张图片

        g_loss = adversarial_loss(discriminator(gen_imgs), valid)
        g_loss.backward()
        optimizer_G.step()

        """训练判别器"""
        optimizer_D.zero_grad()
        real_loss = adversarial_loss(discriminator(real_imgs), valid)
        # 希望把真实的图片判断成正确的标号
        fake_loss = adversarial_loss(discriminator(gen_imgs.detach()), fake)
        # 希望把生成的数据判断成虚假的标号
        d_loss = (real_loss + fake_loss) / 2
        # 真假损失求和再求平均

        d_loss.backward()
        optimizer_D.step()

        print("[Epoch %d/%d] [Batch %d/%d] [D loss: %f] [G loss: %f]" % (epoch, opt.n_epochs,i, len(dataloader), d_loss.item(), g_loss.item()))
        

        batches_done = epoch * len(dataloader) + i
        if batches_done % opt.sample_interval == 0:
            save_image(gen_imgs.data[:25], "images%d.png" % batches_done, nrows=5,normalize=True)
#nrow为大图片中每行所包含的小图片的个数,默认为8个,得到的大图片的形状为(B / nrow, nrow)。输入是#(B x C x H x W)B是批量大小,就是128,128/5等于25.6。一张图就有25张图片。normalize如果为 #True,则将图像移动到 value_range 指定的最小值和最大值 (0, 1) 范围内。





nn.BatchNorm讲解,nn.BatchNorm1d, nn.BatchNorm2d代码演示-CSDN博客

PyTorch学习笔记:nn.LeakyReLU——LeakyReLU激活函数-CSDN博客

Python 的np.prod函数详解-CSDN博客

python pytorch中 .view()函数讲解-CSDN博客

Pytorch的GPU计算(cuda)_net.cuda()-CSDN博客

Python os.makedirs详细介绍-CSDN博客

pytorch技巧 五: 自定义数据集 torch.utils.data.DataLoader 及Dataset的使用_pytorch torch.utils.data.dataloader dataset-CSDN博客

pytorch中的数据导入之DataLoader和Dataset的使用介绍_pytorch中训练数据集如何转变为dataset-CSDN博客

十分钟搞懂Pytorch如何读取MNIST数据集_pytorch读取mnist数据集-CSDN博客

transforms.Compose()函数-CSDN博客

数据归一化处理transforms.Normalize()-CSDN博客

torchvision.transforms.ToTensor详解 | 使用transforms.ToTensor()出现用户警告 | 图像的H W C 代表什么_torchvision.transforms.totensor()-CSDN博客

pytorch torchvision.transforms.Normalize()中的mean和std参数---解惑_x_normalized = (x - mean(x)) ./ std(x);矩阵维度不一致-CSDN博客

Pytorch(五)入门:DataLoader 和 Dataset_pytorch dataset dataloader-CSDN博客

pytorch 中 torch.optim.Adam 方法的使用和参数的解释-CSDN博客

Python-torch.optim优化算法理解之optim.Adam()_pytorch optim.adam-CSDN博客

torch.Tensor — PyTorch master documentation

torch.Tensor.fill_(value)方法_torch.fill-CSDN博客

详解激活函数(Sigmoid/Tanh/ReLU/Leaky ReLu等) - 知乎 (zhihu.com)

PyTorch学习笔记(20) ——激活函数_nn.hardtanh(0,4)-CSDN博客

PyTorch学习笔记(6)——DataLoader源代码剖析-CSDN博客

torchvision中datasets.MNIST介绍-CSDN博客

pytorch个人学习笔记(2)—Normalize()参数详解及用法_pytorch normalize-CSDN博客

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

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

相关文章

【嵌入式移植】5、U-Boot源码分析2—make nanopi_neo2_defconfig

U-Boot源码分析2—make nanopi_neo2_defconfig 1 概述2 nanopi_neo2_defconfig3 编译过程分析3.1 编译目标3.2 scripts_basic3.2.1 prefix src定义3.2.2 PHONY3.2.3 __build3.2.4 fixdep3.3 objscripts/kconfig 1 概述 上一章中&#xff0c;对Makefile相关源码进行了初步分析&…

Vue-cli脚手架将组件挂载到全局

局部引用组件,直接将组件引入,注册组件即可,这篇文章讲组件挂载到全局的方法! main.js文件 将组件引入main.js文件中,并且注册 使用方法 在需要的地方使用组件即可 BaoGit.Vue代码 <template><div><a href"https://gitee.com/ah-ah-bao"><img …

【机器学习】正则化

正则化是防止模型过拟合的方法&#xff0c;它通过对模型的权重进行约束来控制模型的复杂度。 正则化在损失函数中引入模型复杂度指标&#xff0c;利用给W加权值&#xff0c;弱化了数据的噪声&#xff0c;一般不正则化b。 loss(y^,y)&#xff1a;模型中所有参数的损失函数&…

PID校正

一、Introduction to PID Control PID控制是一种应用非常广泛的控制算法。小到控制一个元件的温度&#xff0c;大到控制无人机的飞行姿态和飞行速度等等&#xff0c;都可以使用PID控制。PID(proportion integration differentiation)其实就是指比例&#xff0c;积分&#xff0…

Python tkinter (10) ——Combobox控件

本文主要是Python tkinter Combobox下拉控件介绍及使用示例。 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 Python tkinte…

Springboot入门教程详解

Springboot入门教程详解 博客主页&#xff1a;划水的阿瞒的博客主页 欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ 系列专栏&#xff1a;Springboot入门教程详解首发时间&#xff1a;&#x1f39e;2024年1月29日&#x1f3a0; 如果觉得博主的文章还不错的话&#xff0c…

【DeepLearning-10】yolo.py文件关键代码parse_model(d, ch)函数

这段代码功能是根据提供的配置字典&#xff08;d&#xff09;和输入通道列表&#xff08;ch&#xff09;来解析并构建一个YOLOv5模型。函数的核心工作是遍历模型的每一层&#xff0c;并根据配置创建相应的神经网络层。 我们可以在函数中为新增模块配置构造参数设置。 函数中 f…

MyBatis 如何整合 Druid 连接池?

Mybatis 如何整合 Druid 数据连接池呢&#xff1f;首先打开创建的 Maven 工程&#xff0c;找到 pom.xml 文件&#xff0c;添加 Druid 依赖。 <!--druid连接池--> <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId&…

MySQL-窗口函数 简单易懂

窗口函数 考查知识点&#xff1a; • 如何用窗口函数解决排名问题、Top N问题、前百分之N问题、累计问题、每组内比较问题、连续问题。 什么是窗口函数 窗口函数也叫作OLAP&#xff08;Online Analytical Processing&#xff0c;联机分析处理&#xff09;函数&#xff0c;可…

HCIP复习课(mpls实验)

1、IP配置&#xff1a; R1&#xff1a; R2&#xff1a; R3&#xff1a; R4&#xff1a; R5&#xff1a; R6&#xff1a; R7&#xff1a; R8&#xff1a; 2、rip&#xff0c;ospf配置&#xff1a; R2&#xff1a; R3&#xff1a; R4&#xff1a; R5&#xff1a; R6&#xff1a…

MySQL知识点总结(一)——一条SQL的执行过程、索引底层数据结构、一级索引和二级索引、索引失效、索引覆盖、索引下推

MySQL知识点总结&#xff08;一&#xff09;——一条SQL的执行过程、索引底层数据结构、一级索引和二级索引、索引失效、索引覆盖、索引下推 一条SQL的执行过程索引底层数据结构为什么不使用二叉树&#xff1f;为什么不使用红黑树?为什么不使用hash表&#xff1f;为什么不使用…

屏蔽系统热键/关机/注入 Winlogon(中)

1 前言 在新的内容开始前&#xff0c;我想整理一些旧文&#xff0c;这一框题展示了在以前的系统上实现在用户关机/重启/注销时弹出对话框的功能。为什么需要先讲这个部分&#xff1f;因为这一部分需要拦截的函数是截至 Win 8 系统&#xff0c;微软所采用的关机/重启等途径上的…

海外推广是企业必须面临和重视的问

随着中国半导体国际化进程的加快&#xff0c;越来越多的企业开始走向海外市场&#xff0c;对于企业出海来说&#xff0c;想要最大限度的提高曝光度&#xff0c;提升企业核心竞争力&#xff0c;做好海外推广是企业必须面临和重视的问题。萨科微(www.slkoric.com)半导体积极布局海…

海思SD3403,SS928/926,hi3519dv500,hi3516dv500移植yolov7,yolov8(12)

上一篇用MindStudio转换完yolov8的om模型,准备在板卡里进行推理验证了。 我这里用的是我们自己的Tofu5m模块,40mm40mm含外壳尺寸。可以输入网络RTSP视频流直接进行推理。这次用hi3516dv500版本的Tofu5m模块。 SDK里的demo部分是H.264视频输入,为了保持一致来验证,先改成H.…

金融行业现场故障处理实录

KL银行现场服务记录—HA故障 服务时间 2019年9月10日星期二 14&#xff1a;40 到2019年9月11日星期三 0&#xff1a;30 服务内容 排查redhat RHEL 6.4 一个节点cman启动故障。 &#xff08;1&#xff09;、查看系统日志&#xff1b; &#xff08;2&#xff09;、查看ha日志…

工业PoE交换机的应用场景有哪些?

工业PoE&#xff08;Power over Ethernet&#xff09;交换机是一种特殊设计用于工业环境的网络设备&#xff0c;它不仅具备普通交换机的网络连接功能&#xff0c;还能提供电源供给支持PoE设备。以下是工业PoE交换机的一些常见应用场景&#xff1a; 监控系统&#xff1a; 工业…

勒索病毒如何预防?用什么工具

勒索病毒进入服务器加密文件&#xff0c;让文件变得不能访问&#xff0c;我们经常可以见到这样的新闻&#xff0c;被勒索后没什么好的办法&#xff0c;只能交钱。 碰到言而有信的黑客还好。有时候交钱了&#xff0c;坏人也未必给你解密文件。 有什么工具可以预防这样的勒索病…

Windows Qt C++ VTK 绘制三维曲线

Qt 自带数据可视化从文档上看&#xff0c;只能实现三维曲面。 QwtPlot3D在Qt6.6.0上没编译通过。 QCustomPlot 只能搞二维。 VTK~搞起。抄官网demo。 后续需求&#xff1a; 1、对数轴 2、Y轴逆序 3、Z轴值给色带&#xff0c;类似等高线图的色带 期待各位大佬多多指导。…

免费开源的微信小程序源码、小游戏源码精选70套!

微信小程序已经成为我们日常的一部分了&#xff0c;也基本是每个程序员都会涉及的内容&#xff0c;今天给大家分享从网络收集的70个小程序源码。其中这些源码包含&#xff1a;小游戏到商城小程序&#xff0c;再到实用的工具小程序&#xff0c;以及那些令人惊叹的防各大站点的小…

【Linux】动态库和静态库——动态库和静态库的打包和使用、gcc编译、拷贝到系统默认的路径、建立软连接

文章目录 动态库和静态库1.静态库和动态库的介绍2.静态库的打包和使用2.1生成静态库2.2使用静态库的三种方式2.2.1gcc编译2.2.2拷贝到系统默认的路径2.2.3建立软连接 3.动态库的打包和使用3.1生成动态库3.2使用动态库3.3解决加载不到动态库的方法 动态库和静态库 1.静态库和动…