AE VAE 代码和结果记录

news2024/11/18 1:29:48

Auto Encoder 在MNIST 上记录

直接上代码

import os
os.chdir(os.path.dirname(__file__))
import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
from torchvision import transforms
from torchvision.utils import save_image
from torch.utils.tensorboard import SummaryWriter

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

sample_dir = 'samples'
if not os.path.exists(sample_dir):
    os.makedirs(sample_dir, exist_ok=True)

writer = SummaryWriter(sample_dir)

# Hyper-parameters
image_size = 784
h_dim = 400
z_dim = 20
num_epochs = 15
batch_size = 128
learning_rate = 1e-3

# MNIST dataset
dataset_train = torchvision.datasets.MNIST(root='../data',
                                train=True,
                                transform=transforms.ToTensor(),
                                download=True)
dataset_test = torchvision.datasets.MNIST(root='../data',
                                train=False,
                                transform=transforms.ToTensor(),
                                download=True)
data_loader_train = torch.utils.data.DataLoader(dataset=dataset_train,
                                batch_size=batch_size,
                                shuffle=True)
data_loader_test = torch.utils.data.DataLoader(dataset=dataset_test,
                                batch_size=batch_size,
                                shuffle=False)                            
# AE model
class AE(nn.Module):
    def __init__(self, image_size=784, h_dim=400, z_dim=20):
        super(AE, self).__init__()
        self.fc1 = nn.Linear(image_size, h_dim)
        self.fc2 = nn.Linear(h_dim, z_dim)
        # self.fc3 = nn.Linear(h_dim, z_dim)
        self.fc4 = nn.Linear(z_dim, h_dim)
        self.fc5 = nn.Linear(h_dim, image_size)
    
    def encode(self, x):
        x = F.relu(self.fc1(x))
        h = F.relu(self.fc2(x))
        return h

    def decode(self, z):
        h = F.relu(self.fc4(z))
        return F.sigmoid(self.fc5(h))

    def forward(self, x):
        h = self.encode(x)
        x_recon = self.decode(h)
        return x_recon

def reconstruct_loss_binaray(x, y):
    return F.binary_cross_entropy(x, y, size_average=False)

def reconstruct_loss_real(x, y):
    return F.mse_loss(x, y)

model = AE().to(device)

writer.add_graph(model, input_to_model=torch.rand(1, 28 * 28).to(device))

optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)


ld = len(data_loader_train)
accumulated_iter = 0
for epoch in range(num_epochs):
    for i, (x, _) in enumerate(data_loader_train):
        # forward
        x = x.to(device).view(-1, image_size)
        x_recon = model(x)

        loss = reconstruct_loss_real(x_recon, x)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        accumulated_iter += 1

        writer.add_scalar('loss', loss.item(), global_step=accumulated_iter)

        if (i+1) % 10 == 0:
            print("Epoch[{}/{}], Step [{}/{}], Reconst Loss: {:.4f}".format(epoch+1, num_epochs, i+1, ld, loss.item()))
    
    # 根据test数据集来看重建效果
    # with torch.no_grad():
        # x,_ = iter(data_loader_test).next()
        # x = x.to(device).view(-1, image_size)
        # x_recon = model(x).view(-1, 1, 28, 28)
        # writer.add_images('images_src', x.view(-1, 1, 28, 28), global_step=epoch)
        # writer.add_images('images_reconst', x_recon, global_step=epoch)

    # 根据随机变量decode来看重建效果
    with torch.no_grad():
        z = torch.randn(batch_size, z_dim).to(device)
        x_recon = model.decode(z).view(-1, 1, 28, 28)
        writer.add_images('images_reconst', x_recon, global_step=epoch)

writer.close()

loss函数用了两种,一种MSE,一种是CrossEntropy。测试阶段尝试两种,一种是用test集合做测试,一种是随机给一个隐变量,解码出一个结果,效果分别如下:

test测试集效果如下
在这里插入图片描述

随机隐变量效果如下,可以看到非常差
在这里插入图片描述

Variational Auto Encoder 在MNIST 上记录

代码如下,只有model和部分训练代码有修改

import os
os.chdir(os.path.dirname(__file__))
import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
from torchvision import transforms
from torchvision.utils import save_image
from torch.utils.tensorboard import SummaryWriter

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

sample_dir = 'samples'
if not os.path.exists(sample_dir):
    os.makedirs(sample_dir, exist_ok=True)

writer = SummaryWriter(sample_dir)

# Hyper-parameters
image_size = 784
h_dim = 400
z_dim = 20
num_epochs = 15
batch_size = 128
learning_rate = 1e-3

# MNIST dataset
dataset_train = torchvision.datasets.MNIST(root='../data',
                                train=True,
                                transform=transforms.ToTensor(),
                                download=True)
dataset_test = torchvision.datasets.MNIST(root='../data',
                                train=False,
                                transform=transforms.ToTensor(),
                                download=True)
data_loader_train = torch.utils.data.DataLoader(dataset=dataset_train,
                                batch_size=batch_size,
                                shuffle=True)
data_loader_test = torch.utils.data.DataLoader(dataset=dataset_test,
                                batch_size=batch_size,
                                shuffle=False)                            
# VAE model
class VAE(nn.Module):
    def __init__(self, image_size=784, h_dim=400, z_dim=20):
        super(VAE, self).__init__()
        self.fc1 = nn.Linear(image_size, h_dim)
        self.fc2 = nn.Linear(h_dim, z_dim)
        self.fc3 = nn.Linear(h_dim, z_dim)
        self.fc4 = nn.Linear(z_dim, h_dim)
        self.fc5 = nn.Linear(h_dim, image_size)
    
    def encode(self, x):
        h = F.relu(self.fc1(x))
        return self.fc2(h), self.fc3(h)

    def decode(self, z):
        h = F.relu(self.fc4(z))
        return F.sigmoid(self.fc5(h))

    def reparameterize(self, mu, log_var):
        std = torch.exp(log_var/2)
        eps = torch.randn_like(std)
        return mu + eps * std

    def forward(self, x):
        mu, log_var = self.encode(x)
        z = self.reparameterize(mu, log_var)
        x_recon = self.decode(z)
        return x_recon, mu, log_var

def reconstruct_loss_binaray(x, y):
    return F.binary_cross_entropy(x, y, size_average=False)

def reconstruct_loss_real(x, y):
    return F.mse_loss(x, y)

def kl_loss(mu, log_var):
    return -0.5 * torch.sum(1 + log_var - mu.pow(2) - log_var.exp())

model = VAE().to(device)
writer.add_graph(model, input_to_model=torch.rand(1, 28 * 28).to(device))

optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
ld = len(data_loader_train)
accumulated_iter = 0
for epoch in range(num_epochs):
    for i, (x, _) in enumerate(data_loader_train):
        # forward
        x = x.to(device).view(-1, image_size)
        x_recon, mu, log_var = model(x)

        loss_rec = reconstruct_loss_binaray(x_recon, x)
        loss_kl =  kl_loss(mu, log_var)
        loss = loss_rec + loss_kl

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        accumulated_iter += 1

        writer.add_scalar('loss', loss.item(), global_step=accumulated_iter)

        if (i+1) % 10 == 0:
            print("Epoch[{}/{}], Step [{}/{}], Reconst Loss: {:.4f},  KL Loss: {:.4f}.".format(epoch+1, num_epochs, i+1, ld, loss_rec.item(), loss_kl.item()))
    
    # 根据test数据集来看重建效果
    with torch.no_grad():
        x,_ = iter(data_loader_test).next()
        x = x.to(device).view(-1, image_size)
        x_recon,_,_ = model(x)
        x_recon = x_recon.view(-1, 1, 28, 28)
        writer.add_images('images_src', x.view(-1, 1, 28, 28), global_step=epoch)
        writer.add_images('images_reconst', x_recon, global_step=epoch)

    # 根据随机变量decode来看重建效果
    # with torch.no_grad():
    #     z = torch.randn(batch_size, z_dim).to(device)
    #     x_recon = model.decode(z).view(-1, 1, 28, 28)
    #     writer.add_images('images_reconst', x_recon, global_step=epoch)

writer.close()

单独看测试集重建结果,区别不大
在这里插入图片描述
根据随机数重建的效果还可以,比AE强很多了。
在这里插入图片描述
这里也试试把隐变量Z设为全0,然后前两维进行一个遍历,看看输出的结果是不是有某种规律,代码如下


    with torch.no_grad():
        x_all = torch.zeros(10, 10, 1, 28, 28).to(device)
        for a, da in enumerate(torch.linspace(-0.5, 0.5, 10)):
            for b, db in enumerate(torch.linspace(-0.5, 0.5, 10)):
                z = torch.zeros(1, z_dim).to(device)
                z[0, 0] = da
                z[0, 1] = db
                x_recon = model.decode(z).view(-1, 1, 28, 28)
                x_all[a,b] = x_recon[0]
        
        x_all = x_all.view(10*10, 1, 28, 28)
        imgs = torchvision.utils.make_grid(x_all, pad_value=2,nrow=10)
        writer.add_image('images_uniform', imgs, epoch, dataformats='CHW')

图片太小,不是很清晰,但是也能很明显的看到图像沿着x和y轴在发生形变
在这里插入图片描述

Auto Encoder 在Anime 上记录

这里我们试试更加复杂的数据集,二次元头像数据集,数据集下载自 https://github.com/jayleicn/animeGAN
并且我们也把模型改成CNN进行尝试
代码如下

import os
os.chdir(os.path.dirname(__file__))
import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
import torchvision.datasets as dset
from torchvision import transforms
from torchvision.utils import save_image
from torch.utils.tensorboard import SummaryWriter

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

sample_dir = 'samples'
if not os.path.exists(sample_dir):
    os.makedirs(sample_dir, exist_ok=True)

writer = SummaryWriter(sample_dir)

# Hyper-parameters
h_dim = 1024
z_dim = 32
num_epochs = 15
batch_size = 128
learning_rate = 1e-3
data_root = '../data/anime-faces'

# Anime dataset
def is_valid_file(fpath):
    fname = os.path.basename(fpath)
    return fname[0] != '.'

T = transforms.Compose([
            transforms.Scale(64),
            transforms.ToTensor(),
            transforms.Normalize((0.5,0.5,0.5), (0.5,0.5,0.5)), # bring images to (-1,1)
        ])
dataset = dset.ImageFolder(
    root=data_root,
    transform=T,
    is_valid_file=is_valid_file
)
data_loader = torch.utils.data.DataLoader(dataset, 
                                        batch_size=batch_size,
                                        shuffle=True, 
                                        num_workers=1)


# AE model
class AE(nn.Module):
    def __init__(self, h_dim=h_dim, z_dim=z_dim):
        super(AE, self).__init__()

        self.conv1 = nn.Conv2d(3,  32,  4, stride=2, padding=1)
        self.conv2 = nn.Conv2d(32, 64,  4, stride=2, padding=1)
        self.conv3 = nn.Conv2d(64, 128, 4, stride=2, padding=1)
        self.conv4 = nn.Conv2d(128, 256, 4, stride=2, padding=1)
        self.fc1 = nn.Linear(4096, h_dim)
        self.fc2 = nn.Linear(h_dim, z_dim)

        self.deconv1 = nn.ConvTranspose2d(256, 128, 4, stride=2, padding=1)
        self.deconv2 = nn.ConvTranspose2d(128, 64, 4, stride=2, padding=1)
        self.deconv3 = nn.ConvTranspose2d(64, 32, 4, stride=2, padding=1)
        self.deconv4 = nn.ConvTranspose2d(32, 3, 4, stride=2, padding=1)
        self.fc3 = nn.Linear(z_dim, h_dim)
        self.fc4 = nn.Linear(h_dim, 4096)
    
    def encode(self, x):
        bz = x.shape[0] # 128 x 3 x 64 x 64 
        x = F.relu(self.conv1(x)) # 128 x 32 x 32 x 32 
        x = F.relu(self.conv2(x)) # 128 x 64 x 16 x 16 
        x = F.relu(self.conv3(x)) # 128 x 128 x 8 x 8
        x = F.relu(self.conv4(x)) # 128 x 256 x 4 x 4
        x = torch.flatten(x, start_dim=1) # 128 x 4096
        h = F.relu(self.fc1(x)) # 128 x 1024
        z = F.relu(self.fc2(h)) # 128 x 32
        return z

    def decode(self, z):
        h = F.relu(self.fc3(z))  # 128 x 1024
        x = F.relu(self.fc4(h))  # 128 x 512
        x = x.view(-1, 256, 4, 4) # 128 x 256 x 4 x 4
        x = F.relu(self.deconv1(x)) # 128 x 128 x 8 x 8 
        x = F.relu(self.deconv2(x))  # 128 x 64 x 16 x 16 
        x = F.relu(self.deconv3(x))  # 128 x 32 x 32 x 32 
        x = F.tanh(self.deconv4(x))  # 128 x 3 x 64 x 64
        return x

    def forward(self, x):
        h = self.encode(x)
        x_recon = self.decode(h)
        return x_recon

def reconstruct_loss_binaray(x, y):
    return F.binary_cross_entropy(x, y, size_average=False)

def reconstruct_loss_real(x, y):
    return F.mse_loss(x, y, size_average=False)

model = AE().to(device)

optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

ld = len(data_loader)
accumulated_iter = 0
for epoch in range(num_epochs):
    for i, (x, _) in enumerate(data_loader):
        # forward
        x = x.to(device)
        x_recon = model(x)

        loss = reconstruct_loss_real(x_recon, x)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        accumulated_iter += 1

        writer.add_scalar('loss', loss.item(), global_step=accumulated_iter)

        if (i+1) % 10 == 0:
            print("Epoch[{}/{}], Step [{}/{}], Reconst Loss: {:.4f}".format(epoch+1, num_epochs, i+1, ld, loss.item()))
    
    # 根据test数据集来看重建效果
    with torch.no_grad():
        x,_ = iter(data_loader).next()
        x = x.to(device)
        x_recon = model(x)

        imgs_src = torchvision.utils.make_grid(x, pad_value=2, normalize=True)
        writer.add_image('images_src', imgs_src, epoch, dataformats='CHW')

        imgs_rec = torchvision.utils.make_grid(x_recon, pad_value=2, normalize=True)
        writer.add_image('images_reconst', imgs_rec, epoch, dataformats='CHW')

    # 根据随机变量decode来看重建效果
    with torch.no_grad():
        z = torch.randn(batch_size, z_dim).to(device)
        x_recon = model.decode(z).view(-1, 3, 64, 64)

        imgs_rand = torchvision.utils.make_grid(x_recon, pad_value=2, normalize=True)
        writer.add_image('images_random', imgs_rand, epoch, dataformats='CHW')

writer.close()

针对代码,补充一句,里面计算loss时的size_average=False非常重要,不加上的话训练会出问题。

重建的效果如下,看着马马虎虎,比较模糊,没有好好调代码,应该还可以提升
在这里插入图片描述
随机生成的效果就非常差了
在这里插入图片描述

VAE 在Anime 上记录

再看看VAE的效果。

代码我就不重复贴这么多了,把模型部分贴上来

# VAE model
class VAE(nn.Module):
    def __init__(self, h_dim=h_dim, z_dim=z_dim):
        super(VAE, self).__init__()

        self.conv1 = nn.Conv2d(3,  32,  4, stride=2, padding=1)
        self.conv2 = nn.Conv2d(32, 64,  4, stride=2, padding=1)
        self.conv3 = nn.Conv2d(64, 128, 4, stride=2, padding=1)
        self.conv4 = nn.Conv2d(128, 256, 4, stride=2, padding=1)
        self.fc1 = nn.Linear(4096, h_dim)
        self.fc2_1 = nn.Linear(h_dim, z_dim)
        self.fc2_2 = nn.Linear(h_dim, z_dim)

        self.deconv1 = nn.ConvTranspose2d(256, 128, 4, stride=2, padding=1)
        self.deconv2 = nn.ConvTranspose2d(128, 64, 4, stride=2, padding=1)
        self.deconv3 = nn.ConvTranspose2d(64, 32, 4, stride=2, padding=1)
        self.deconv4 = nn.ConvTranspose2d(32, 3, 4, stride=2, padding=1)
        self.fc3 = nn.Linear(z_dim, h_dim)
        self.fc4 = nn.Linear(h_dim, 4096)

    def reparameterize(self, mu, log_var):
        std = torch.exp(log_var/2)
        eps = torch.randn_like(std)
        return mu + eps * std

    def encode(self, x):
        bz = x.shape[0] # 128 x 3 x 64 x 64 
        x = F.relu(self.conv1(x)) # 128 x 32 x 32 x 32 
        x = F.relu(self.conv2(x)) # 128 x 64 x 16 x 16 
        x = F.relu(self.conv3(x)) # 128 x 128 x 8 x 8
        x = F.relu(self.conv4(x)) # 128 x 256 x 4 x 4
        x = torch.flatten(x, start_dim=1) # 128 x 4096
        h = F.relu(self.fc1(x)) # 128 x 1024
        return self.fc2_1(h), self.fc2_2(h), # 128 x 30

    def decode(self, z):
        h = F.relu(self.fc3(z))  # 128 x 1024
        x = F.relu(self.fc4(h))  # 128 x 512
        x = x.view(-1, 256, 4, 4) # 128 x 256 x 4 x 4
        x = F.relu(self.deconv1(x)) # 128 x 128 x 8 x 8 
        x = F.relu(self.deconv2(x))  # 128 x 64 x 16 x 16 
        x = F.relu(self.deconv3(x))  # 128 x 32 x 32 x 32 
        x = F.tanh(self.deconv4(x))  # 128 x 3 x 64 x 64
        return x

    def forward(self, x):
        mu, log_var = self.encode(x)
        z = self.reparameterize(mu, log_var)
        x_recon = self.decode(z)
        return x_recon, mu, log_var

再就是训练的时候

for epoch in range(num_epochs):
    for i, (x, _) in enumerate(data_loader):
        # forward
        x = x.to(device)
        x_recon, mu, log_var = model(x)

        loss_rec = reconstruct_loss_real(x_recon, x)
        loss_kl =  kl_loss(mu, log_var)
        loss = loss_rec + loss_kl

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

针对代码,补充一句,里面计算loss时的size_average=False非常重要,不加上的话训练会出问题。但是有一个问题我没想明白,就是在我设为True的时候,为什么也会影响到kl_loss的计算出来的值的大小呢?设为True,kl_loss值非常小,设为False,值会比较大,按道理,这个的计算与计算重建loss是独立的才对。

重建的结果
在这里插入图片描述

随机生成的结果
在这里插入图片描述

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

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

相关文章

数据结构-学习-01-线性表之顺序表-初始化、销毁、清理、获取长度、判断为空、获取元素等实现

一、测试环境 名称值cpu12th Gen Intel Core™ i7-12700H操作系统CentOS Linux release 7.9.2009 (Core)内存3G逻辑核数2gcc 版本4.8.5 20150623 二、个人理解 数据结构分为逻辑结构和物理结构(也称为存储结构)。 1、逻辑结构 逻辑结构又可以分为以下…

JS 事件

事件 事件是 JS 和 HTML 交互的桥梁。采用“观察者模式”,使用仅在事件发生时执行的监听器(也叫处理程序)订阅事件 事件流 事件流描述的是页面接收事件的顺序。分为 3 各阶段: 事件捕获:最先触发,可以做…

致敬经典 睛彩再现——AVS产业联盟和中国移动咪咕公司携手推动AVS3视频、音频标准

2022年11月14日,中国移动咪咕公司首发AVS3移动端规模化商用版本咪咕视频6.0.7.00,该版本下设的“致敬经典 睛彩再现”专区、以及“菁彩视听”双Vivid直播视角(Audio Vivid & HDR Vivid),通过国家自主的AVS3、Audio…

回顾复习【矩阵分析】初等因子 和 矩阵的相似 || 由不变因子求初等因子 || 由初等因子和秩求Smith标准形(不变因子)

目录 1. 由不变因子,引出 初等因子的概念2. 【必看】例子:已知 不变因子,求初等因子。3.【必看】 例子:已知 秩和初等因子,求史密斯标准形(不变因子)4. 分块矩阵 初等因子的 求法5. 数字矩阵的相似 与 入-矩阵的等价1. 由不变因子,引出 初等因子的概念 例如,下面两个矩阵…

Kotlin 开发Android app(十):Android控件绑定ViewBinding

上一节中,我们知道了Android的布局,这种把界面和逻辑控制分开,是编程里很好的分离方式,也大大的解耦了界面和逻辑控制,使得编程的逻辑不在和界面挂钩。 有了界面的布局,我们需要把界面和代码部分进行绑定&…

OpenPose训练教程

找遍全网都没有非常完整的OpenPose训练教程 决定自己摸索并且记录下来 openpose作者发布了一份训练代码,下面根据这个来操作 GitHUB地址: openpsoe_train 环境:ubuntu 执行matklab脚本的时候懒得下载新的matlab 就在windows下运行的 感觉没…

品质为先,服务不停,广州流辰信息公司恪守初心,匠心为民!

随着互联网技术的蓬勃发展,越来越多的企业也感受到了日益激烈的竞争,也意识到墨守成规的发展模式必当会让企业停滞不前,只有一步一个脚印,始终跟随市场的脚步创新升级,才有可能在汹涌的市场洪流中站稳脚跟。广州流辰信…

精简 Windows10

下载链接文后评论里找: 旧机福音 极限精简Win10系统Tiny10https://baijiahao.baidu.com/s?id1743901721464184983不想成天折腾操作系统,一直以来都认为跟着微软每月升级就好了。但是现实啪啪的打脸:升级到Windows11 22H2 后, 连…

常见算法设计与分析的简单C++代码实现(排列、二分法搜索、Dijkstra算法、元素换位、单调子序列、硬币问题、运动员最佳匹配问题)

常见算法设计与分析的简单C代码实现(排列、二分法搜索、Dijkstra算法、元素换位、单调子序列、硬币问题、运动员最佳匹配问题)1 一些简单排列问题2 二分法查找3 前后元素换位4 找最长单调递增子序列(O(n2)复杂度)5最小硬币问题一、…

c3p0,DBCP,Druid(德鲁伊)数据库连接池

c3p0,DBCP,Druid(德鲁伊)数据库连接池 每博一文案 佛说:前世 500 次的回眸,才换来今生的一次擦肩而过。 人与人之间的缘分,真的无需强求,并不是所有的感情都能天长地久,…

C#压缩图片

SqlSer数据库设置保存图片字段类型为Image类型 对应保存 方法参数为图片路径&#xff0c;压缩后路径&#xff0c;压缩最大宽度&#xff0c;压缩最大高度 引用类型using System.Data; using System.Drawing; using System.IO; \完整类 /// <summary> /// 按比例缩放&…

七牛qshell 批量上传 mac 本地目录

七牛qshell 批量上传 mac 本地目录下载路径及使用方法(官方)下载到自己指定的文件夹添加环境变量,使qshell在任意地方可以执行添加密钥 生成账户文件下载路径及使用方法(官方) https://developer.qiniu.com/kodo/1302/qshell记录自己部署遇到的问题及操作步骤 下载到自己指定…

音视频开发核心知识点及源码解析,还不赶紧收藏起来

随着基础设施的完善&#xff08;光纤入户、wifi覆盖、5G普及&#xff09;的影响&#xff0c;将短视频、直播、视频会议、在线教育、在线医疗瞬间推到了顶峰&#xff0c;人们对音视频的需求和要求也越来越强烈 音视频开发还具有许多方向&#xff0c;比如&#xff1a; 如果对音视…

C语言:while后加分号与for后加分号的区别

while 后面不能加分号&#xff0c;否则虽然编译可以通过&#xff0c;但是执行程序时会发生死循环#include <stdio.h> int main() { int i1,total0; while(i<100)//不能在 while 后面加分号 { totali; i;//循环…

个人付费专栏上线预热

个人付费专栏上线预热 专栏地址&#xff1a;请点击访问 文章目录一、订阅这个专栏有什么好处&#xff1f;二、实战项目预告1. 活动类站点 &#xff08;已完成前端后端&#xff09;2. 电商项目 &#xff08;筹备中&#xff0c;一比一还原设计图&#xff09;3. 论坛问答系统 &…

每日三题-爬楼梯、买卖股票的最佳时机、正则表达式匹配

&#x1f468;‍&#x1f4bb;个人主页&#xff1a; 才疏学浅的木子 &#x1f647;‍♂️ 本人也在学习阶段如若发现问题&#xff0c;请告知非常感谢 &#x1f647;‍♂️ &#x1f4d2; 本文来自专栏&#xff1a; 算法 &#x1f308; 算法类型&#xff1a;Hot100题 &#x1f3…

IP 摄像机移动应用 SDK 开发入门教程(安卓版)

涂鸦智能安卓版摄像机&#xff08;IP Camera&#xff0c;简称 IPC&#xff09;SDK 是基于智能生活 App SDK 开发而成。 通过移动应用控制物理网设备是常见的使用场景&#xff0c;但由于设备的品类丰富&#xff0c;增大了应用开发难度。因此 智能生活 App SDK 提供了常见的垂直…

支付宝支付内网穿透

支付宝支付&内网穿透一 沙箱环境二 python第三方模块python-alipay-sdk三 python-alipay-sdk二次封装四 支付接口五 内网穿透5.1 cpolar软件5.2 测试支付宝post回调一 沙箱环境 注册认证沙箱环境&#xff1a;https://openhome.alipay.com/platform/appDaily.htm?tabinfo …

【FileZila】实现windows与Linux系统文件互传

1、下载安装FileZila客户端 根据自己的PC系统版本&#xff0c;下载对应的FileZila客户端https://www.filezilla.cn/download/client 2、Linux服务端&#xff0c;安装配置vsftpd 2.1 安装ftp服务 sudo apt-get install vsftpd2.2 配置ftp服务 &#xff08;1&#xff09;打开ft…

Verilog 实现CDC中单bit 跨时钟域,从慢时钟域到快时钟域

单bit 跨时钟域&#xff0c;从慢时钟域到快时钟域1&#xff0c;首先&#xff0c;了解一些问题2&#xff0c;RTL代码设计3&#xff0c;testbench测试代码4&#xff0c;RTL代码和testbench综合的电路原理图5&#xff0c;前仿真&#xff0c;验证![在这里插入图片描述](https://img…