2024.4.14 机器学习周报

news/2024/5/17 14:37:24

目录

引言

Abstract

文献阅读

1、题目

2、引言

3、过去方案

4、创新点

5、方法

6、混合CNN-LSTM模型

7、实验过程

8、实验结果与评价

深度学习

通过VGG实现图片分类

1.data.py文件,用于处理数据

2.txt.py 将指定文件夹中的特定类型的图片路径和对应的类别索引号写入文本文件

3.net.py 定义了一个 VGG16 分类模型,并提供了加载预训练权重、修改分类器和进行前向传播的功能

4.main.py 训练模型

5.predict.py 加载训练好的 VGG16 模型并对给定的图像进行分类

6、展示效果

总结

引言

本周我阅读了一篇关于混合CNN-LSTM模型的文献,研究旨在改进LSTM模型对印度尼西亚雅加达社区对PPKM的情感分析的准确性,采用基于词-表情符号嵌入的混合CNN-LSTM模型,通过结合CNN和LSTM模型,利用词嵌入和表情符号嵌入特征来反映临时短期情感依赖关系和长期情感关系,通过评估模型的性能指标,得出CNN-LSTM混合模型在词+表情符号数据集上的表现更好,还通过实现VGG代码训练模型和图片分类

Abstract

This week, I read a literature on a hybrid CNN-LSTM model aimed at improving the accuracy of LSTM model in sentiment analysis of PPKM in the Jakarta community of Indonesia. A hybrid CNN-LSTM model based on word emoticon embedding was adopted, which combined CNN and LSTM models and utilized word embedding and emoticon embedding features to reflect temporary short-term and long-term emotional relationships. The performance indicators of the model were evaluated, It is concluded that the CNN-LSTM hybrid model performs better on the word+emoticon dataset, and the model is trained and image classification is achieved by implementing VGG code training

文献阅读

1、题目

A Hybrid CNN-LSTM Model With Word-Emoji Embedding For Improving The Twitter Sentiment Analysis on Indonesia’s PPKM Policy

2、引言

实施限制社区动员的政策,以降低COVID-19的每日发病率。然而,一个高精度的情绪分析模型可以确定公众对这些政策的情绪。作者的研究旨在提高LSTM模型在雅加达社区对PPKM的情感分析上的准确性,使用带有表情符号嵌入的印度尼西亚语推文。第一阶段是使用混合CNN-LSTM模型建模。它是CNN和LSTM的结合。CNN模型引用了单词嵌入和表情符号嵌入功能,这些功能反映了对临时短期情绪的依赖。与此同时,LSTM在单词和表情符号之间建立了长期的情感关系。接下来,模型评估使用准确度、损失、受试者工作曲线(ROC)、精确度和召回率曲线以及曲线下面积(AUC)值来查看所设计模型的性能。根据测试结果,我们得出结论,CNN-LSTM混合模型在单词+表情符号数据集上表现更好。ROC曲线下面积AUC为0.966,而精确-召回曲线AUC为0.957。

3、过去方案

以前的研究使用LSTM模型对推文进行负面和正面情感分类,并取得了0.917的准确性得分。另一些研究使用表情符号嵌入来提高推文情感分类的性能。然而,使用表情符号嵌入的改进方法在提高模型准确性方面仍存在研究机会。

4、创新点

首先,采用混合CNN-LSTM模型进行建模,该模型结合了CNN和LSTM,利用词嵌入和表情符号嵌入特征来反映临时短期情感依赖关系和长期情感关系。然后,通过评估模型的性能指标,如准确性、损失、ROC曲线、精确率-召回率曲线和AUC值,来观察设计模型的性能。

  • 证明了词+表情符号嵌入方法的优越性;
  • 解决了数据不平衡问题,采用随机过采样、ROC曲线和精确率-召回率曲线;
  • 提出了一个良好的混合CNN+LSTM模型,采用softmax激活函数和SGD优化算法。

5、方法

上图解释了研究流程,讨论了作者在研究中所采取的步骤,包括从数据收集,预处理,标记,单词emoji嵌入,建模和评估开始的几个步骤。

上图讨论在预处理阶段所采取的步骤,预处理是一个从媒体社交twitter收集数据集的过程,将清除不需要的元素。这样数据就干净、高质量、符合要求。预处理过程分为几个阶段,即翻译,大小写折叠,表情符号处理,去除标点符号,标记化,去除停用词和词干。

在预处理之后,下一个过程使用TextBlob库基于极性和主观性为每个推文标记积极或消极的标签。计算公式如下:

6、混合CNN-LSTM模型

CNN-LSTM 模型由一个初始卷积层组成,它将接收标题中每个标记的单词嵌入作为输入。从CNN层生成的输出将被聚合到更小的维度,然后馈送到LSTM层,LSTM层提取局部特征。经过预处理阶段后,语义相关的单词和表情符号将被转换为数字并制成嵌入层。稍后,这个嵌入层将用作LSTM的输入,情感分类方法,然后转换为向量,以找到语义相似性。

以下是所提出的CNN-LSTM 模型的公式:

对于输出层,使用softmax激活函数,softmax在其输入上执行标准的指数运算,并对每个类进行归一化,以便所有类的结果之和等于1。softmax激活的公式如下:

其中 \sigma (x)_{i} 是输入x的softmax激活函数,K是类的数量,e^{x} 是输入x的标准指数函数。

使用随机梯度下降(SGD)。SGD用随机值代替了整体损失函数的梯度下降计算,计算公式如下:

其中 w 是权重,η 是学习率,:= 是赋值运算,Q_{i} 是向量微分算子,Q_{i}(w) 是数据项i的神经元函数。

7、实验过程

本研究使用NLTK库对数据集进行停用词去除和词干提取。预处理阶段包括翻译、大小写转换、表情符号处理、去除标点符号、分词、去除停用词和词干提取。使用TextBlob库根据极性和主观性为每个推文标记正面或负面情感,使用的数据集包括从2021年9月到11月收集的3000条推文,使用了DKI Jakarta地理编码。数据集被分为50%的训练数据和50%的测试数据,并使用随机过采样方法来解决数据集中的不平衡问题。

8、实验结果与评价

使用准确度和损失对训练过程进行评估,预测数据由真阳性(TP)和真阴性(TN)组成,损失函数公式如下:

其中p是积极情绪类,n是消极情绪类,t是实际值,f(s)是预测结果。

精确度-召回率曲线与ROC相似,但使用精确度和召回率代替TPR和FPR。两条曲线的定量性能是AUC,即每条曲线下的面积。AUC方程如下:

上图分别是单词+表情符号模型与单词模型相比训练损失基于损失曲线值和单词+emoji模型训练精度对比words模型准确度曲线值的模型拟合评估结果。

模型拟合的评估显示,具有单词+emoji数据集的 CNN-LSTM 模型结果ROC和精确度-召回率曲线高于具有单词数据集的模型。在评估拟合模型后,我们计算AUC。我们的目标是找出两个模型的AUC有多大。从这项研究中,我们发现,与单词数据集相比,具有单词+emoji数据集的CNN-LSTM模型具有上级AUC。words+emoji数据集的ROC AUC = 0.966,而words数据集的ROC AUC为0.946。同时,单词+表情符号数据集的精确度-召回率曲线AUC = 0.957,而单词数据集的精确度-召回率曲线AUC为0.932。

深度学习

通过VGG实现图片分类

1.data.py文件,用于处理数据

import cv2
import numpy as np
import torch.utils.data as data
from PIL import  Image
def preprocess_input(x):x/=127.5x-=1.return x
def cvtColor(image):if len(np.shape(image))==3 and np.shape(image)[-2]==3:return imageelse:image=image.convert('RGB')return image
class DataGenerator(data.Dataset):def __init__(self,annotation_lines,inpt_shape,random=True):self.annotation_lines=annotation_linesself.input_shape=inpt_shapeself.random=randomdef __len__(self):return len(self.annotation_lines)def __getitem__(self, index):annotation_path=self.annotation_lines[index].split(';')[1].split()[0]image=Image.open(annotation_path)image=self.get_random_data(image,self.input_shape,random=self.random)image=np.transpose(preprocess_input(np.array(image).astype(np.float32)),[2,0,1])y=int(self.annotation_lines[index].split(';')[0])return image,ydef rand(self,a=0,b=1):return np.random.rand()*(b-a)+adef get_random_data(self,image,inpt_shape,jitter=.3,hue=.1,sat=1.5,val=1.5,random=True):image=cvtColor(image)iw,ih=image.sizeh,w=inpt_shapeif not random:scale=min(w/iw,h/ih)nw=int(iw*scale)nh=int(ih*scale)dx=(w-nw)//2dy=(h-nh)//2image=image.resize((nw,nh),Image.BICUBIC)new_image=Image.new('RGB',(w,h),(128,128,128))new_image.paste(image,(dx,dy))image_data=np.array(new_image,np.float32)return image_datanew_ar=w/h*self.rand(1-jitter,1+jitter)/self.rand(1-jitter,1+jitter)scale=self.rand(.75,1.25)if new_ar<1:nh=int(scale*h)nw=int(nh*new_ar)else:nw=int(scale*w)nh=int(nw/new_ar)image=image.resize((nw,nh),Image.BICUBIC)#将图像多余的部分加上灰条dx=int(self.rand(0,w-nw))dy=int(self.rand(0,h-nh))new_image=Image.new('RGB',(w,h),(128,128,128))new_image.paste(image,(dx,dy))image=new_image#翻转图像flip=self.rand()<.5if flip: image=image.transpose(Image.FLIP_LEFT_RIGHT)rotate=self.rand()<.5if rotate:angle=np.random.randint(-15,15)a,b=w/2,h/2M=cv2.getRotationMatrix2D((a,b),angle,1)image=cv2.warpAffine(np.array(image),M,(w,h),borderValue=[128,128,128])#色域扭曲hue=self.rand(-hue,hue)sat=self.rand(1,sat) if self.rand()<.5 else 1/self.rand(1,sat)val=self.rand(1,val) if self.rand()<.5 else 1/self.rand(1,val)x=cv2.cvtColor(np.array(image,np.float32)/255,cv2.COLOR_RGB2HSV)#颜色空间转换x[...,1]*=satx[...,2]*=valx[x[:,:,0]>360,0]=360x[:,:,1:][x[:,:,1:]>1]=1x[x<0]=0image_data=cv2.cvtColor(x,cv2.COLOR_HSV2RGB)*255return image_data

2.txt.py 将指定文件夹中的特定类型的图片路径和对应的类别索引号写入文本文件

import os
from os import getcwdclasses=['cat','dog','panda']
sets=['train']if __name__=='__main__':wd=getcwd()for se in sets:list_file=open('cls_'+ se +'.txt','w')datasets_path=setypes_name=os.listdir(datasets_path)#os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表for type_name in types_name:if type_name not in classes:continuecls_id=classes.index(type_name)#输出0-1photos_path=os.path.join(datasets_path,type_name)photos_name=os.listdir(photos_path)for photo_name in photos_name:_,postfix=os.path.splitext(photo_name)#该函数用于分离文件名与拓展名if postfix not in['.jpg','.png','.jpeg']:continuelist_file.write(str(cls_id)+';'+'%s/%s'%(wd, os.path.join(photos_path,photo_name)))list_file.write('\n')list_file.close()

3.net.py 定义了一个 VGG16 分类模型,并提供了加载预训练权重、修改分类器和进行前向传播的功能

import torch
import torch.nn as nnfrom torch.hub import load_state_dict_from_urlmodel_urls = {"vgg16": "C:/Users/daxin761/Desktop/vggmast-master/path/vgg16-397923af.pth",#"vgg16": "https://download.pytorch.org/models/vgg16-397923af.pth",
}#权重下载网址class VGG(nn.Module):def __init__(self, features, num_classes = 1000, init_weights= True, dropout = 0.5):super(VGG,self).__init__()self.features = featuresself.avgpool = nn.AdaptiveAvgPool2d((7, 7))#AdaptiveAvgPool2d使处于不同大小的图片也能进行分类self.classifier = nn.Sequential(nn.Linear(512 * 7 * 7, 4096),nn.ReLU(True),nn.Dropout(p=dropout),nn.Linear(4096, 4096),nn.ReLU(True),nn.Dropout(p=dropout),#完成4096的全连接nn.Linear(4096, num_classes),#对num_classes的分类)if init_weights:for m in self.modules():if isinstance(m, nn.Conv2d):nn.init.kaiming_normal_(m.weight, mode="fan_out", nonlinearity="relu")if m.bias is not None:nn.init.constant_(m.bias, 0)elif isinstance(m, nn.BatchNorm2d):nn.init.constant_(m.weight, 1)nn.init.constant_(m.bias, 0)elif isinstance(m, nn.Linear):nn.init.normal_(m.weight, 0, 0.01)nn.init.constant_(m.bias, 0)def forward(self, x):x = self.features(x)x = self.avgpool(x)x = torch.flatten(x, 1)#对输入层进行平铺,转化为一维数据x = self.classifier(x)return xdef make_layers(cfg, batch_norm = False):#make_layers对输入的cfg进行循环layers = []in_channels = 3for v in cfg:#对cfg进行输入循环,取第一个vif v == "M":layers += [nn.MaxPool2d(kernel_size=2, stride=2)]#把输入图像进行缩小else:conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=1)#输入通道是3,输出通道64if batch_norm:layers += [conv2d, nn.BatchNorm2d(v), nn.ReLU(inplace=True)]else:layers += [conv2d, nn.ReLU(inplace=True)]in_channels = vreturn nn.Sequential(*layers)cfgs = {"D": [64, 64, "M", 128, 128, "M", 256, 256, 256, "M", 512, 512, 512, "M", 512, 512, 512, "M"],}def vgg16(pretrained=False, progress=True,num_classes=3):model = VGG(make_layers(cfgs['D']))if pretrained:state_dict = load_state_dict_from_url(model_urls['vgg16'],model_dir='./model' ,progress=progress)#预训练模型地址model.load_state_dict(state_dict)if num_classes !=1000:model.classifier = nn.Sequential(nn.Linear(512 * 7 * 7, 4096),nn.ReLU(True),nn.Dropout(p=0.5),#随机删除一部分不合格nn.Linear(4096, 4096),nn.ReLU(True),#防止过拟合nn.Dropout(p=0.5),nn.Linear(4096, num_classes),)return model
if __name__=='__main__':in_data=torch.ones(1,3,224,224)net=vgg16(pretrained=False, progress=True,num_classes=2)out=net(in_data)print(out)

4.main.py 训练模型

import torch
import torch.nn as nn
from net import vgg16
from torch.utils.data import DataLoader#工具取黑盒子,用函数来提取数据集中的数据(小批次)
from data import *
'''数据集'''
annotation_path='cls_train.txt'#读取数据集生成的文件
with open(annotation_path,'r') as f:lines=f.readlines()
np.random.seed(10101)#函数用于生成指定随机数
np.random.shuffle(lines)#数据打乱
np.random.seed(None)
num_val=int(len(lines)*0.2)#十分之一数据用来测试
num_train=len(lines)-num_val
#输入图像大小
input_shape=[224,224]   #导入图像大小
train_data=DataGenerator(lines[:num_train],input_shape,True)
val_data=DataGenerator(lines[num_train:],input_shape,False)
val_len=len(val_data)
print(val_len)#返回测试集长度
# 取黑盒子工具
"""加载数据"""
gen_train=DataLoader(train_data,batch_size=4)#训练集batch_size读取小样本,规定每次取多少样本
gen_test=DataLoader(val_data,batch_size=4)#测试集读取小样本
'''构建网络'''
device=torch.device('cuda'if torch.cuda.is_available() else "cpu")#电脑主机的选择
net=vgg16(True, progress=True,num_classes=3)#定于分类的类别
net.to(device)
'''选择优化器和学习率的调整方法'''
lr=0.0001#定义学习率
optim=torch.optim.Adam(net.parameters(),lr=lr)#导入网络和学习率
sculer=torch.optim.lr_scheduler.StepLR(optim,step_size=1)#步长为1的读取
'''训练'''
epochs=1#读取数据次数,每次读取顺序方式不同
for epoch in range(epochs):total_train=0 #定义总损失for data in gen_train:img,label=datawith torch.no_grad():img =img.to(device)label=label.to(device)optim.zero_grad()output=net(img)train_loss=nn.CrossEntropyLoss()(output,label).to(device)train_loss.backward()#反向传播optim.step()#优化器更新total_train+=train_loss #损失相加sculer.step()total_test=0#总损失total_accuracy=0#总精度for data in gen_test:img,label =data #图片转数据with torch.no_grad():img=img.to(device)label=label.to(device)optim.zero_grad()#梯度清零out=net(img)#投入网络test_loss=nn.CrossEntropyLoss()(out,label).to(device)total_test+=test_loss#测试损失,无反向传播accuracy=((out.argmax(1)==label).sum()).clone().detach().cpu().numpy()#正确预测的总和比测试集的长度,即预测正确的精度total_accuracy+=accuracyprint("训练集上的损失:{}".format(total_train))print("测试集上的损失:{}".format(total_test))print("测试集上的精度:{:.1%}".format(total_accuracy/val_len))#百分数精度,正确预测的总和比测试集的长度torch.save(net.state_dict(),"DogandCat{}.pth".format(epoch+1))print("模型已保存")

5.predict.py 加载训练好的 VGG16 模型并对给定的图像进行分类

from torchvision import transforms
from PIL import Image
import matplotlib.pyplot as plt
import torch
import torch.nn.functional as F
from net import vgg16
import osos.environ['KMP_DUPLICATE_LIB_OK'] = 'True'test_pth = r'D:/test/image/2.jpg'  # 设置可以检测的图像
test = Image.open(test_pth)
'''处理图片'''
transform = transforms.Compose([transforms.Resize((224, 224)), transforms.ToTensor()])
image = transform(test)
'''加载网络'''
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")  # CPU与GPU的选择
net = vgg16()  # 输入网络
model = torch.load(r"./DogandCat1.pth", map_location=device)  # 已训练完成的结果权重输入
net.load_state_dict(model)  # 模型导入
net.eval()  # 设置为推测模式
image = torch.reshape(image, (1, 3, 224, 224))  # 四维图形,RGB三个通
with torch.no_grad():out = net(image)
out = F.softmax(out, dim=1)  # softmax 函数确定范围
out = out.data.cpu().numpy()
print(out)
a = int(out.argmax(1))  # 输出最大值位置
plt.figure()
list = ['Cat', 'Dog', 'panda']
plt.suptitle("Classes:{}:{:.1%}".format(list[a], out[0, a]))  # 输出最大概率的道路类型
plt.imshow(test)
plt.show()

6、展示效果

总结

本周阅读混合CNN-LSTM模型的相关文献,深入理解了CNN和LSTM其中应用的层面,并且通过代码复现VGG模型结构,并且对实现了图片分类,对其中的原理有了更深入的理解。


http://www.mrgr.cn/p/51085268

相关文章

精通-Python-网络安全(一)

精通 Python 网络安全(一)原文:zh.annas-archive.org/md5/2fd2c4f6d02f5009e067781f7b1aee0c 译者:飞龙 协议:CC BY-NC-SA 4.0前言 最近,Python 开始受到越来越多的关注,最新的 Python 更新添加了许多可用于执行关键任务的包。我们的主要目标是帮助您利用 Python 包来检…

Spring boot中使用groovy

groovy 是当做一个脚本来用的,也可以从数据库加载代码做一些动态数据处理。 搭建一个spring boot环境,pom.xml中编辑器和jar包,spring boot是 2.1.6.RELEASE <dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy-all</artifa…

MySQL好用的函数等

详情见:[MySQL函数汇总](https://www.cnblogs.com/kissdodog/p/4168721.html "MySQL函数汇总")

小程序管理平台建设的想法和见解

继微信正式推出微信小程序后,各个大厂陆续发布了各自的小程序平台 —— 支付宝小程序、百度小程序、头条小程序,各家不同的小程序标准一度让开发者们激情开骂,虽然目前跨平台的小程序开发可以通过taro、mpvue、kbone等跨平台开发框架来解决,但是不同平台的小程序管还是非常…

【C语言回顾】函数

前言1. 函数的概念和分类2.库函数3. 自定义函数3.1 自定义函数的简单介绍3.2 自定义函数举例 4. 形参和实参4.1 形参4.2 实参4.3 形参和实参的关系4.3.1 理解4.3.2 举例代码和调试 5. 嵌套函数和链式访问5.1 嵌套函数5.2 链式访问 6. 函数的声明和定义6.1 单个文件6.2 多个文件…

无法用raven-js,如何直接使用TraceKit标准化错误字符串(一次有趣的探索)

引子&#xff1a;网上三年前&#xff08;2020&#xff09;的文章介绍了一个raven-js 简单说就是把堆栈信息格式化兼容各浏览器&#xff0c;便于查看错误来源。 **but&#xff1a;**到处找了一下raven-js&#xff0c;已经没有官方出处了&#xff0c;只在Sentry的源码仓库里发现…

【系统分析师】计算机网络

文章目录 1、TCP/IP协议族1.1 DHCP协议1.2 DNS协议1.3网络故障诊断 2、网路规划与设计2.1逻辑网络设计2.2物理网络设计2.3 分层设计 3、网络接入3.1 接入方式3.2 IPv6地址 4、综合布线技术5、物联网5.1物联网概念与分层5.2 物联网关键技术 6、云计算7、网络存储技术&#xff08…

网上订餐系统|基于springboot的网上订餐系统设计与实现(源码+数据库+文档)

网上订餐系统目录 目录 基于springboot的网上订餐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户功能模块的实现 &#xff08;1&#xff09;用户注册界面 &#xff08;2&#xff09;用户登录界面 &#xff08;3&#xff09;菜品详情界面 &#xff08…

网站创建的流程是什么

网站的创建过程包括几个主要的步骤&#xff0c;其中涉及到一系列的决策和实践操作。下面我将详细介绍网站创建的流程&#xff0c;帮助读者了解如何创建一个成功的网站。 第一步&#xff1a;确定网站目标和功能 在创建网站之前&#xff0c;你需要明确自己网站的目标和功能。是用…

自动生成接口文档coreapi

drf-yasg只能用于drf 去看官方文档 2 coreapi pip install coreapi 2.1 配置路由 from rest_framework.documentation import include_docs_urlsurlpatterns = [...path(docs/, include_docs_urls(title=站点页面标题)) ]2.2 drf配置 #AttributeError: AutoSchema object has n…

OpenTelemetry入门看这一篇就够了

分布式跟踪可以帮助查看整个请求过程中服务之间的交互,并可以让我们深入了解系统中请求的整个生命周期。它帮助我们发现应用程序中的错误、瓶颈和性能问题。OpenTelemetry 可以用于从应用程序收集数据。它是一组工具、API 和 SDK 集合,我们可以使用它们来检测、生成、收集和导…

HTML5漫画风格个人介绍源码

源码介绍 HTML5漫画风格个人介绍源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果截图 源码下载 HTML5漫画风格…

Big Data and Cognitive Computing (IF=3.7) 计算机/大数据/人工智能期刊投稿

Special Issue: Artificial Cognitive Systems for Computer Vision 欢迎计算机/大数据/人工智能/计算机视觉相关工作的投稿&#xff01; 影响因子3.7&#xff0c;截止时间2024年12月31日 投稿咨询&#xff1a;lqyan18fudan.edu.cn 投稿网址&#xff1a;https://www.mdpi.com/j…

交换机丢包问题

一、测试丢包的方法二、丢包的类型链路丢包拥塞丢包MAC地址漂移STP震荡二三层表项超规格

linux查看mysql占用磁盘空间

linux查看mysql占用磁盘空间 1.通过ps -ef | grep mysql命令查看mysql相关信息,找出mysql的data目类:2.检查数据目录大小 du -sh /home/db_mysql/mysql

华为OD-C卷-攀登者1[100分]

攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。 例如: [0,1,2,4,3,1,0,0,1,2,3,1,2,1,0],代表如下图所示的地图 地图中有两个山脉位置分别为 1,2,3,4,5 和 8,9,1…

6-01. Timeline 创建

创建 Intro Canvas注意,把 Intro Canvas 的 Sort Order 改为 10,确保可以完全遮盖其它物品 添加 PanelColor 改成 11102E新建 New Game Cutscene把文件放到 GameData / Timeline为了方便操作,可以把右上方改成秒 声音切割的办法在最后的时候添加关键帧,包括坐标、大小、是否…

6-02. 创建 Timeline 的对话

修改 NewGame Cutscene选择 Add Active Track 创建新场景创建 DialogBehaviour创建 DialogClip创建 DialogTrack修改 DialogBehaviour编辑 DialogClip 首先添加 DialogTrack,然后再 Add Dialog Clip可以把 Has To Pause 勾选一下 再添加一个 DialogClip修改 DialogBehaviour创…

记一次“XMR门罗币挖矿木马病毒”处置

记一次“XMR门罗币挖矿木马病毒”处置一、背景概述 故事的起因于26号下午做渗透测试时,登录跳板机发现CPU进程拉满到200%,qiao哥看了一眼直接说是XMR挖矿,这句话勾引起我的兴趣,由于应急是我的薄弱项也没有时间深入学习,所以有本篇应急分析文章。 市面上存在很多关于XMR门…

Java | Leetcode Java题解之第36题有效的数独

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isValidSudoku(char[][] board) {int[][] rows new int[9][9];int[][] columns new int[9][9];int[][][] subboxes new int[3][3][9];for (int i 0; i < 9; i) {for (int j 0; j < 9; j) {char …