第G2周:人脸图像生成(DCGAN)
🍨 本文为[🔗365天深度学习训练营学习记录博客\n🍦 参考文章:365天深度学习训练营\n🍖 原作者:[K同学啊 | 接辅导、项目定制]\n🚀 文章来源:[K同学的学习圈子](https://www.yuque.com/mingtian-fkmxf/zxwb45)
一、设置超参数、导入数据
import os
import random
import argparse
import numpy as np
import torch
import torch.nn as nn
import torch.nn.parallel
import torch.optim as optim
import torch.utils.data
from torch.autograd import Variable
from torch.utils.data import DataLoader
from torchvision import datasets as dset
import torchvision.utils as vutils
from torchvision.utils import save_image
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from IPython.display import HTMLmanualSeed = 999 # 随机种子
print("Random Seed: ", manualSeed)
random.seed(manualSeed)
torch.manual_seed(manualSeed)
torch.use_deterministic_algorithms(True) # Needed for reproducible results# 超参数配置
dataroot = "D:/GAN-Data" # 数据路径
batch_size = 128 # 训练过程中的批次大小
n_epochs = 5 # 训练的总轮数
img_size = 64 # 图像的尺寸(宽度和高度)
nz = 100 # z潜在向量的大小(生成器输入的尺寸)
ngf = 64 # 生成器中的特征图大小
ndf = 64 # 判别器中的特征图大小
beta1 = 0.5 # Adam优化器的Beta1超参数
beta2 = 0.2 # Adam优化器的Beta1超参数
lr = 0.0002 # 学习率# 创建数据集
dataset = dset.ImageFolder(root=dataroot,transform=transforms.Compose([transforms.Resize(img_size), # 调整图像大小transforms.CenterCrop(img_size), # 中心裁剪图像transforms.ToTensor(), # 将图像转换为张量transforms.Normalize((0.5, 0.5, 0.5), # 标准化图像张量(0.5, 0.5, 0.5)),]))
# 创建数据加载器
dataloader = torch.utils.data.DataLoader(dataset,batch_size=batch_size, # 批量大小shuffle=True) # 是否打乱数据集
# 选择要在哪个设备上运行代码
device = torch.device("cuda:0" if (torch.cuda.is_available()) else "cpu")
print("使用的设备是:",device)
# 绘制一些训练图像
real_batch = next(iter(dataloader))
plt.figure(figsize=(8,8))
plt.axis("off")
plt.title("Training Images")
plt.imshow(np.transpose(vutils.make_grid(real_batch[0].to(device)[:24],padding=2,normalize=True).cpu(),(1,2,0)))

二、定义模型、可视化
# 自定义权重初始化函数,作用于netG和netD
def weights_init(m):# 获取当前层的类名classname = m.__class__.__name__# 如果类名中包含'Conv',即当前层是卷积层if classname.find('Conv') != -1:# 使用正态分布初始化权重数据,均值为0,标准差为0.02nn.init.normal_(m.weight.data, 0.0, 0.02)# 如果类名中包含'BatchNorm',即当前层是批归一化层elif classname.find('BatchNorm') != -1:# 使用正态分布初始化权重数据,均值为1,标准差为0.02nn.init.normal_(m.weight.data, 1.0, 0.02)# 使用常数初始化偏置项数据,值为0nn.init.constant_(m.bias.data, 0)'''
定义生成器 Generator
'''class Generator(nn.Module):def __init__(self):super(Generator, self).__init__()self.main = nn.Sequential(# 输入为Z,经过一个转置卷积层nn.ConvTranspose2d(nz, ngf * 8, 4, 1, 0, bias=False),nn.BatchNorm2d(ngf * 8), # 批归一化层,用于加速收敛和稳定训练过程nn.ReLU(True), # ReLU激活函数# 输出尺寸:(ngf*8) x 4 x 4nn.ConvTranspose2d(ngf * 8, ngf * 4, 4, 2, 1, bias=False),nn.BatchNorm2d(ngf * 4),nn.ReLU(True),# 输出尺寸:(ngf*4) x 8 x 8nn.ConvTranspose2d(ngf * 4, ngf * 2, 4, 2, 1, bias=False),nn.BatchNorm2d(ngf * 2),nn.ReLU(True),# 输出尺寸:(ngf*2) x 16 x 16nn.ConvTranspose2d(ngf * 2, ngf, 4, 2, 1, bias=False),nn.BatchNorm2d(ngf),nn.ReLU(True),# 输出尺寸:(ngf) x 32 x 32nn.ConvTranspose2d(ngf, 3, 4, 2, 1, bias=False),nn.Tanh() # Tanh激活函数# 输出尺寸:3 x 64 x 64)def forward(self, x):return self.main(x)# 创建生成器
netG = Generator().to(device)
# 使用 "weights_init" 函数对所有权重进行随机初始化,
# 平均值(mean)设置为0,标准差(stdev)设置为0.02。
netG.apply(weights_init)
# 打印生成器模型
print(netG)'''
定义判别器 Discriminator
'''class Discriminator(nn.Module):def __init__(self):super(Discriminator, self).__init__()# 定义判别器的主要结构,使用Sequential容器将多个层按顺序组合在一起self.main = nn.Sequential(# 输入大小为3 x 64 x 64nn.Conv2d(3, ndf, 4, 2, 1, bias=False),nn.LeakyReLU(0.2, inplace=True),# 输出大小为(ndf) x 32 x 32nn.Conv2d(ndf, ndf * 2, 4, 2, 1, bias=False),nn.BatchNorm2d(ndf * 2),nn.LeakyReLU(0.2, inplace=True),# 输出大小为(ndf*2) x 16 x 16nn.Conv2d(ndf * 2, ndf * 4, 4, 2, 1, bias=False),nn.BatchNorm2d(ndf * 4),nn.LeakyReLU(0.2, inplace=True),# 输出大小为(ndf*4) x 8 x 8nn.Conv2d(ndf * 4, ndf * 8, 4, 2, 1, bias=False),nn.BatchNorm2d(ndf * 8),nn.LeakyReLU(0.2, inplace=True),# 输出大小为(ndf*8) x 4 x 4nn.Conv2d(ndf * 8, 1, 4, 1, 0, bias=False),nn.Sigmoid())def forward(self, x):# 将输入通过判别器的主要结构进行前向传播return self.main(x)# 创建判别器对象
netD = Discriminator().to(device)
# 应用 "weights_init" 函数来随机初始化所有权重
# 使用 mean=0, stdev=0.2 的方式进行初始化
netD.apply(weights_init)
# 打印判别器模型
print(netD)# 初始化“BCELoss”损失函数
criterion = nn.BCELoss()
# 创建用于可视化生成器进程的潜在向量批次
fixed_noise = torch.randn(64, nz, 1, 1, device=device)
real_label = 1.
fake_label = 0.
# 为生成器(G)和判别器(D)设置Adam优化器
optimizerD = optim.Adam(netD.parameters(), lr=lr, betas=(beta1, beta2))
optimizerG = optim.Adam(netG.parameters(), lr=lr, betas=(beta1, beta2))img_list = [] # 用于存储生成的图像列表
G_losses = [] # 用于存储生成器的损失列表
D_losses = [] # 用于存储判别器的损失列表
iters = 0 # 迭代次数

三、训练模型
print("Starting Training Loop...") # 输出训练开始的提示信息
# 进行多个epoch的训练
for epoch in range(n_epochs):# 对于dataloader中的每个batchfor i, data in enumerate(dataloader, 0):############################# (1) 更新判别器网络:最大化 log(D(x)) + log(1 - D(G(z)))############################## 使用真实图像样本训练netD.zero_grad() # 清除判别器网络的梯度# 准备真实图像的数据real_cpu = data[0].to(device)b_size = real_cpu.size(0)label = torch.full((b_size,), real_label, dtype=torch.float, device=device) # 创建一个全是真实标签的张量# 将真实图像样本输入判别器,进行前向传播output = netD(real_cpu).view(-1)# 计算真实图像样本的损失errD_real = criterion(output, label)# 通过反向传播计算判别器的梯度errD_real.backward()D_x = output.mean().item() # 计算判别器对真实图像样本的输出的平均值## 使用生成图像样本训练# 生成一批潜在向量noise = torch.randn(b_size, nz, 1, 1, device=device)# 使用生成器生成一批假图像样本fake = netG(noise)label.fill_(fake_label) # 创建一个全是假标签的张量# 将所有生成的图像样本输入判别器,进行前向传播output = netD(fake.detach()).view(-1)# 计算判别器对生成图像样本的损失errD_fake = criterion(output, label)# 通过反向传播计算判别器的梯度errD_fake.backward()D_G_z1 = output.mean().item() # 计算判别器对生成图像样本的输出的平均值# 计算判别器的总损失,包括真实图像样本和生成图像样本的损失之和errD = errD_real + errD_fake# 更新判别器的参数optimizerD.step()############################# (2) 更新生成器网络:最大化 log(D(G(z)))############################netG.zero_grad() # 清除生成器网络的梯度label.fill_(real_label) # 对于生成器成本而言,将假标签视为真实标签# 由于刚刚更新了判别器,再次将所有生成的图像样本输入判别器,进行前向传播output = netD(fake).view(-1)# 根据判别器的输出计算生成器的损失errG = criterion(output, label)# 通过反向传播计算生成器的梯度errG.backward()D_G_z2 = output.mean().item() # 计算判别器对生成器输出的平均值# 更新生成器的参数optimizerG.step()# 输出训练统计信息if i % 400 == 0:print('[%d/%d][%d/%d]\tLoss_D: %.4f\tLoss_G: %.4f\tD(x): %.4f\tD(G(z)): %.4f / %.4f'% (epoch, n_epochs, i, len(dataloader), errD.item(), errG.item(), D_x, D_G_z1, D_G_z2))# 保存损失值以便后续绘图G_losses.append(errG.item())D_losses.append(errD.item())# 通过保存生成器在固定噪声上的输出来检查生成器的性能if (iters % 500 == 0) or ((epoch == n_epochs - 1) and (i == len(dataloader) - 1)):with torch.no_grad():fake = netG(fixed_noise).detach().cpu()img_list.append(vutils.make_grid(fake, padding=2, normalize=True))iters += 1# 可视化
plt.figure(figsize=(10,5))
plt.title("Generator and Discriminator Loss During Training")
plt.plot(G_losses,label="G")
plt.plot(D_losses,label="D")
plt.xlabel("iterations")
plt.ylabel("Loss")
plt.legend()
plt.show()# 创建一个大小为8x8的图形对象
fig = plt.figure(figsize=(8, 8))
# 不显示坐标轴
plt.axis("off")
# 将图像列表img_list中的图像转置并创建一个包含每个图像的单个列表ims
ims = [[plt.imshow(np.transpose(i, (1, 2, 0)), animated=True)] for i in img_list]
# 使用图形对象、图像列表ims以及其他参数创建一个动画对象ani
ani = animation.ArtistAnimation(fig, ims, interval=1000, repeat_delay=1000, blit=True)
# 将动画以HTML形式呈现
HTML(ani.to_jshtml())# 从数据加载器中获取一批真实图像
real_batch = next(iter(dataloader))
# 绘制真实图像
plt.figure(figsize=(15,15))
plt.subplot(1,2,1)
plt.axis("off")
plt.title("Real Images")
plt.imshow(np.transpose(vutils.make_grid(real_batch[0].to(device)[:64], padding=5, normalize=True).cpu(),(1,2,0)))
# 绘制上一个时期生成的假图像
plt.subplot(1,2,2)
plt.axis("off")
plt.title("Fake Images")
plt.imshow(np.transpose(img_list[-1],(1,2,0)))
plt.show()
训练结果:
[Epoch 0/50][Batch 0/36][D loss: 1.446340][G loss: 5.497820][D : 0.496465][G : 0.006384]
[Epoch 1/50][Batch 0/36][D loss: 0.198702][G loss: 32.366798][D : 0.000000][G : 0.000000]
[Epoch 2/50][Batch 0/36][D loss: 0.007939][G loss: 39.840797][D : 0.000000][G : 0.000000]
[Epoch 3/50][Batch 0/36][D loss: 0.008718][G loss: 39.420380][D : 0.000000][G : 0.000000]
[Epoch 4/50][Batch 0/36][D loss: 0.000432][G loss: 39.375351][D : 0.000000][G : 0.000000]
[Epoch 5/50][Batch 0/36][D loss: 0.000377][G loss: 39.141502][D : 0.000000][G : 0.000000]
[Epoch 6/50][Batch 0/36][D loss: 0.000066][G loss: 38.554665][D : 0.000000][G : 0.000000]
[Epoch 7/50][Batch 0/36][D loss: 0.000161][G loss: 37.076347][D : 0.000000][G : 0.000000]
[Epoch 8/50][Batch 0/36][D loss: 0.236551][G loss: 5.515038][D : 0.126019][G : 0.009809]
[Epoch 9/50][Batch 0/36][D loss: 0.774763][G loss: 4.037993][D : 0.041982][G : 0.032798]
[Epoch 10/50][Batch 0/36][D loss: 1.355027][G loss: 7.484296][D : 0.627779][G : 0.001169]
[Epoch 11/50][Batch 0/36][D loss: 1.026440][G loss: 3.390290][D : 0.480961][G : 0.066138]
[Epoch 12/50][Batch 0/36][D loss: 0.698196][G loss: 2.289851][D : 0.117281][G : 0.149754]
[Epoch 13/50][Batch 0/36][D loss: 0.407120][G loss: 3.295501][D : 0.169919][G : 0.056703]
[Epoch 14/50][Batch 0/36][D loss: 0.858621][G loss: 4.627818][D : 0.297173][G : 0.028583]
[Epoch 15/50][Batch 0/36][D loss: 1.068889][G loss: 4.085044][D : 0.314014][G : 0.029605]
[Epoch 16/50][Batch 0/36][D loss: 0.761256][G loss: 1.878336][D : 0.122635][G : 0.189217]
[Epoch 17/50][Batch 0/36][D loss: 0.946410][G loss: 5.986092][D : 0.486197][G : 0.005545]
[Epoch 18/50][Batch 0/36][D loss: 0.607918][G loss: 8.022884][D : 0.355339][G : 0.000997]
[Epoch 19/50][Batch 0/36][D loss: 0.387959][G loss: 5.217168][D : 0.148431][G : 0.012128]
[Epoch 20/50][Batch 0/36][D loss: 0.502083][G loss: 3.828265][D : 0.124887][G : 0.032919]
[Epoch 21/50][Batch 0/36][D loss: 0.341051][G loss: 5.217510][D : 0.129790][G : 0.010647]
[Epoch 22/50][Batch 0/36][D loss: 0.305131][G loss: 3.878963][D : 0.118515][G : 0.034831]
[Epoch 23/50][Batch 0/36][D loss: 0.326738][G loss: 3.092067][D : 0.048084][G : 0.073658]
[Epoch 24/50][Batch 0/36][D loss: 1.001996][G loss: 7.870810][D : 0.531534][G : 0.001848]
[Epoch 25/50][Batch 0/36][D loss: 0.646764][G loss: 5.994369][D : 0.328600][G : 0.005999]
[Epoch 26/50][Batch 0/36][D loss: 1.305306][G loss: 3.512106][D : 0.027197][G : 0.060318]
[Epoch 27/50][Batch 0/36][D loss: 0.230971][G loss: 6.018190][D : 0.160877][G : 0.005384]
[Epoch 28/50][Batch 0/36][D loss: 0.479868][G loss: 2.851458][D : 0.012263][G : 0.132684]
[Epoch 29/50][Batch 0/36][D loss: 1.190969][G loss: 6.840727][D : 0.560059][G : 0.003298]
[Epoch 30/50][Batch 0/36][D loss: 1.005036][G loss: 6.322803][D : 0.486148][G : 0.005413]
[Epoch 31/50][Batch 0/36][D loss: 0.407194][G loss: 5.357150][D : 0.025872][G : 0.012775]
[Epoch 32/50][Batch 0/36][D loss: 0.715868][G loss: 4.764071][D : 0.410440][G : 0.018443]
[Epoch 33/50][Batch 0/36][D loss: 0.525104][G loss: 4.291232][D : 0.187566][G : 0.026254]
[Epoch 34/50][Batch 0/36][D loss: 0.363458][G loss: 4.643357][D : 0.184744][G : 0.021312]
[Epoch 35/50][Batch 0/36][D loss: 0.550998][G loss: 3.245662][D : 0.190560][G : 0.078518]
[Epoch 36/50][Batch 0/36][D loss: 0.686132][G loss: 5.602957][D : 0.362706][G : 0.007369]
[Epoch 37/50][Batch 0/36][D loss: 0.556991][G loss: 3.656791][D : 0.147552][G : 0.046845]
[Epoch 38/50][Batch 0/36][D loss: 0.459933][G loss: 4.163424][D : 0.245844][G : 0.033957]
[Epoch 39/50][Batch 0/36][D loss: 0.232279][G loss: 4.535916][D : 0.114630][G : 0.016447]
[Epoch 40/50][Batch 0/36][D loss: 0.479002][G loss: 5.497972][D : 0.263936][G : 0.012047]
[Epoch 41/50][Batch 0/36][D loss: 0.720815][G loss: 3.263973][D : 0.259178][G : 0.061856]
[Epoch 42/50][Batch 0/36][D loss: 0.703234][G loss: 6.425527][D : 0.400735][G : 0.003400]
[Epoch 43/50][Batch 0/36][D loss: 0.741217][G loss: 2.052215][D : 0.048953][G : 0.209300]
[Epoch 44/50][Batch 0/36][D loss: 0.658782][G loss: 3.800625][D : 0.272119][G : 0.040041]
[Epoch 45/50][Batch 0/36][D loss: 0.402264][G loss: 5.260798][D : 0.185568][G : 0.009509]
[Epoch 46/50][Batch 0/36][D loss: 0.753039][G loss: 4.797507][D : 0.406285][G : 0.022727]
[Epoch 47/50][Batch 0/36][D loss: 0.301918][G loss: 4.467443][D : 0.173592][G : 0.022788]
[Epoch 48/50][Batch 0/36][D loss: 0.638086][G loss: 1.768839][D : 0.072733][G : 0.227529]
[Epoch 49/50][Batch 0/36][D loss: 0.576230][G loss: 2.268032][D : 0.082981][G : 0.151779]

相关文章:
第G2周:人脸图像生成(DCGAN)
🍨 本文为[🔗365天深度学习训练营学习记录博客\n🍦 参考文章:365天深度学习训练营\n🍖 原作者:[K同学啊 | 接辅导、项目定制]\n🚀 文章来源:[K同学的学习圈子](https://www.yuque.co…...
【Web】Ctfshow Thinkphp5 非强制路由RCE漏洞
目录 非强制路由RCE漏洞 web579 web604 web605 web606 web607-610 前面审了一些tp3的sql注入,终于到tp5了,要说tp5那最经典的还得是rce 下面介绍非强制路由RCE漏洞 非强制路由RCE漏洞原理 非强制路由相当于开了一个大口子,可以任意调用当前框…...
python3遇到Can‘t connect to HTTPS URL because the SSL module is not available.
远程服务器centos7系统上有minicoda3,觉得太占空间,就把整个文件夹删了,原先的Python3也没了,都要重装。 我自己的步骤:进入管理员模式 1.下载Python3的源码: wget https://www.python.org/ftp/python/3.1…...
QSPI Flash xip取指同时program过程中概率性出现usb播歌时断音
项目场景: USB Audio芯片,代码放到qspi flash中,执行代码时,客户会偶尔保存一些参数,即FPGA验证过程中,每隔10ms向flash info区烧写4个byte(取指过程一直存在,且时隙软件不可控&…...
MySQL聚簇索引和非聚簇索引的区别
前言: 聚簇索引和非聚簇索引是数据库中的两种索引类型,他们在组织和存储数据时有不同的方式。 聚簇索引: 简单理解,就是将数据和索引放在了一起,找到了索引也就找到了数据。对于聚簇索引来说,他的非叶子节点上存储的是…...
【C#】蜗牛爬井问题C#控制台实现
文章目录 一、问题描述二、C#控制台代码 一、问题描述 井深30米,蜗牛在井底,每天爬3米又滑下1米,问第几天爬出来 二、C#控制台代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System…...
IP地址的四大类型:动态IP、固定IP、实体IP、虚拟IP的区别与应用
在网络通信中,IP地址是设备在互联网上唯一标识的关键元素。动态IP、固定IP、实体IP和虚拟IP是四种不同类型的IP地址,它们各自具有独特的特点和应用场景。 1. 动态IP地址: 动态IP地址是由Internet Service Provider(ISPÿ…...
Linux Debian12安装和使用ImageMagick图像处理工具 常见图片png、jpg格式转webp格式
一、ImageMagick简介 ImageMagick是一套功能强大、稳定而且免费的工具集和开发包。可以用来读、写和图像格式转换,可以处理超过100种图像格式,包括流行的TIFF, JPEG, GIF, PNG, PDF以及PhotoCD等格式。对图片的操作,即可以通过命令行进行&am…...
JavaScript二
目录 流程控制 if判断 while循环 do while for循环 forEach for in Map与set iterator 流程控制 if判断 <script>use strictvar age 5;if(age < 3){alert("haha");}else if(age < 5){alert("hi world");}else{alert("hello wor…...
JavaScript系列——正则表达式
文章目录 需求场景正则表达式的定义创建正则表达式通过 / 表示式/ 创建通过构造函数创建 编写一个正则表达式的模式使用简单模式使用特殊字符常用特殊字符列表特殊字符组和范围 正则表达式使用代码演示 常用示例验证手机号码合法性 小结 需求场景 在前端开发领域,在…...
命令行创建Vue项目
Vue项目创建 1. 打开UI界面 在命令行中,执行如下指令: vue ui 2. 打开项目管理器 3. 创建项目 创建项目的过程,需要联网进行,这可能会耗时比较长的时间,请耐心等待。 windows的命令行,容易卡顿,…...
01.PostgreSQL基本SELECT语句
1. SQL简介 SQL 是用于访问和处理数据库的标准的计算机语言。 SQL有两个标准:分别是SQL92和SQL99,他们分别代表了92年和99年颁布的SQL标准,我们今天使用的SQL语言依然遵循这些标准。 注意:除了 SQL 标准之外,大部分 SQL 数据库程序都拥有它们自己的私有扩展! 2. SQL分…...
UDP信号多个电脑的信息传输测试、配置指南
最近要做一个东西,关于一个软件上得到的信号,如何通过连接的局域网,将数据传输出去。我没做过相关的东西,但是我想应该和软件连接数据库的过程大致是差不多的,就一个ip和一个端口号啥的。 一.问题思路 多个设备同时连…...
先序+中序还原二叉树【数据结构】
先序中序还原二叉树 题目描述 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。 输入 输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重…...
【全网首发】洛谷P2678 [NOIP2015 提高组] 跳石头
Everyday English You don’t become what you want; you become whatyou believe. —Oprah Winfrey 你不是成为你想要的,你成为你所相信的。 洛谷P2678 [NOIP2015 提高组] 跳石头 题目描述 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔…...
Gpt指引ubuntu安装java8/11
在Ubuntu系统上安装Java环境通常包括以下几个步骤: 更新软件包索引: 在安装新软件之前,最好先更新Ubuntu的软件包索引。这可以确保你安装的是最新版本的软件包。可以使用以下命令来更新: sudo apt update安装Java: U…...
【MCAL】TC397+EB-tresos之MCU配置实战 - 芯片时钟
本篇文章介绍了在TC397平台使用EB-treso对MCU驱动模块进行配置的实战过程,主要介绍了后续基本每个外设模块都要涉及的芯片时钟部分,帮助读者了解TC397芯片的时钟树结构,在后续计算配置不同外设模块诸如通信速率,定时器周期等&…...
最新AI系统ChatGPT网站H5系统源码,支持AI绘画,GPT语音对话+ChatFile文档对话总结+DALL-E3文生图
一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…...
如何在MAC OS中的XCODE下添加 <bits/stdc++.h>
mac上使用的编译器是Clang,但是没有万能头文件bits/stdc.h\,本文介绍如何添加万能头文件 Xcode 版本:15.1 - 打开应用程序-Xcode-右键显示包内容 Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/includ…...
Maven项目提示Ignored pom.xml问题
1 环境 (1)IDEA开发工具:2022.2.1 (2)JDK:Java17(Spring6要求JDK最低版本是Java17) (3)Spring:6.1.2 (4)Maven 3.8.8 2 …...
MacOS新手必看:用Homebrew安装Redis并设置密码的完整指南
MacOS新手必看:用Homebrew安装Redis并设置密码的完整指南 Redis作为高性能的键值存储系统,已经成为现代开发栈中不可或缺的组件。对于MacOS用户而言,Homebrew提供了最便捷的软件管理方式,让Redis的安装和配置变得异常简单。本文将…...
Copilot认证后强制使用GPT-4o模型的底层逻辑与开发者应对策略
最近在团队里推动AI辅助开发工具落地时,遇到了一个挺有意思的问题:有同事反馈,在完成GitHub Copilot的企业认证后,发现它似乎“锁死”了GPT-4o模型,无法再选择之前的GPT-3.5等版本。这背后是微软随意的调整,…...
Llama-3.2V-11B-cot代码实例:自定义prompt实现SUMMARY→REASONING链
Llama-3.2V-11B-cot代码实例:自定义prompt实现SUMMARY→REASONING链 1. 项目概述 Llama-3.2V-11B-cot 是一个基于Meta Llama 3.2 Vision架构的视觉语言模型,专门设计用于支持系统性推理任务。该模型实现了LLaVA-CoT论文中提出的链式推理方法࿰…...
小白也能画火影:忍者绘卷Z-Image Turbo零基础入门到出图
小白也能画火影:忍者绘卷Z-Image Turbo零基础入门到出图 1. 为什么选择忍者绘卷Z-Image Turbo? 想画出专业级的火影忍者同人图却苦于不会画画?忍者绘卷Z-Image Turbo就是为你量身打造的AI绘画神器。这个基于Tongyi-MAI Z-Image底座的二次元…...
PE_to_shellcode:将Windows可执行文件转化为注入式shellcode的终极方案
PE_to_shellcode:将Windows可执行文件转化为注入式shellcode的终极方案 【免费下载链接】pe_to_shellcode Converts PE into a shellcode 项目地址: https://gitcode.com/gh_mirrors/pe/pe_to_shellcode 在红队渗透测试和恶意软件分析领域,PE文件…...
nlp_structbert_sentence-similarity_chinese-large 在社交网络中的应用:发现相似兴趣社群
nlp_structbert_sentence-similarity_chinese-large 在社交网络中的应用:发现相似兴趣社群 你有没有想过,为什么有些社交平台总能把你推荐给一群聊得来的人?或者,一个刚加入的兴趣小组,里面的讨论氛围却让你感觉像回家…...
Mac(六)彻底清理卸载应用后的「打开方式」残留项
1. 为什么卸载应用后「打开方式」菜单还有残留? 每次在Mac上卸载完应用,本以为可以彻底告别它,结果右键点击文件时,那个阴魂不散的「打开方式」选项还在列表里晃悠。这种情况我遇到过太多次了,特别是像Photoshop、GIMP…...
GME-Qwen2-VL-2B-Instruct开发:Node.js后端服务搭建与API封装
GME-Qwen2-VL-2B-Instruct开发:Node.js后端服务搭建与API封装 如果你正在开发一个需要图片理解能力的应用,比如一个能识别商品图的电商助手,或者一个能分析图表数据的智能工具,那么GME-Qwen2-VL-2B-Instruct这个模型很可能就是你…...
GitHub Java项目Top50:哪些工具能帮你提升开发效率?
GitHub Java项目Top50:开发者效率提升的终极武器库 在当今快节奏的软件开发环境中,效率就是生命线。作为一名Java开发者,你是否经常感到时间不够用?是否在重复造轮子?GitHub上那些经过实战检验的开源项目,正…...
Linux网络栈的幕后英雄:sk_buff结构体如何高效管理数据包?
Linux网络栈的幕后英雄:sk_buff结构体如何高效管理数据包? 在Linux网络协议栈的底层实现中,sk_buff结构体扮演着举足轻重的角色。这个看似简单的数据结构,却是支撑整个网络通信系统的核心骨架。无论是数据包的接收、发送ÿ…...
