强化学习工具箱(Matlab)

1、Get Started

1.1、MDP环境下训练强化学习智能体

MDP环境如下图在这里插入图片描述

  1. 每个圆圈代表一个状态
  2. 每个状态都有上或下的选择
  3. 智能体从状态 1 开始
  4. 智能体接收的奖励值为图中状态转移的值
  5. 训练目标是最大化累计奖励

(1)创建 MDP 环境

创建一个具有 8 个状态和 2 个动作( " up " 和 " down " )的MDP模型。

MDP = createMDP(8,["up";"down"]);

要对上图中状态转换进行建模,需修改 MDP 的状态转换矩阵和奖励矩阵。默认情况下,这些矩阵均为零。有关创建 MDP 模型和 MDP 对象属性的更多信息,请参见 createMDP 。

修改 MDP 的状态转换和奖励矩阵,例如,在以下命令中:

  1. 前两行指定了通过执行动作 1( " up " )从状态 1 到状态 2 的转移,以及此转移对应的奖励 +3
  2. 接下来的两行指定了通过执行操作2( " down " )从状态 1 到状态 3 的转移,以及此转移对应的奖励 +1
MDP.T(1,2,1) = 1;
MDP.R(1,2,1) = 3;
MDP.T(1,3,2) = 1;
MDP.R(1,3,2) = 1;

同理,指定图中其余的状态转移和对应奖励。

% State 2 transition and reward
MDP.T(2,4,1) = 1;
MDP.R(2,4,1) = 2;
MDP.T(2,5,2) = 1;
MDP.R(2,5,2) = 1;
% State 3 transition and reward
MDP.T(3,5,1) = 1;
MDP.R(3,5,1) = 2;
MDP.T(3,6,2) = 1;
MDP.R(3,6,2) = 4;
% State 4 transition and reward
MDP.T(4,7,1) = 1;
MDP.R(4,7,1) = 3;
MDP.T(4,8,2) = 1;
MDP.R(4,8,2) = 2;
% State 5 transition and reward
MDP.T(5,7,1) = 1;
MDP.R(5,7,1) = 1;
MDP.T(5,8,2) = 1;
MDP.R(5,8,2) = 9;
% State 6 transition and reward
MDP.T(6,7,1) = 1;
MDP.R(6,7,1) = 5;
MDP.T(6,8,2) = 1;
MDP.R(6,8,2) = 1;
% State 7 transition and reward
MDP.T(7,7,1) = 1;
MDP.R(7,7,1) = 0;
MDP.T(7,7,2) = 1;
MDP.R(7,7,2) = 0;
% State 8 transition and reward
MDP.T(8,8,1) = 1;
MDP.R(8,8,1) = 0;
MDP.T(8,8,2) = 1;
MDP.R(8,8,2) = 0;

指定状态 7 和状态 8 为 MDP 的终端状态。

MDP.TerminalStates = ["s7";"s8"];

创建强化学习 MDP 环境。

env = rlMDPEnv(MDP);

通过重置函数指定环境的初始状态始终为状态 1,该函数在每次训练或模拟开始时调用。创建一个匿名函数句柄,将初始状态设置为 1。

env.ResetFcn = @() 1;

设置随机数种子。

rng(0)

(2) 创建 Q-Learning 智能体

首先使用 MDP 环境中的观察和动作创建 Q table,将学习率设置为1。

obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);
qTable = rlTable(obsInfo, actInfo);
qFunction = rlQValueFunction(qTable, obsInfo, actInfo);
qOptions = rlOptimizerOptions(LearnRate=1);

然后使用 Q table 创建一个 Q-learning 智能体,遵循 ϵ \epsilon ϵ-贪婪策略。有关创建 Q-learning 智能体的更多信息,请参阅 rlQAgent 和 rlQAgentOptions 。

agentOpts = rlQAgentOptions;
agentOpts.DiscountFactor = 1;
agentOpts.EpsilonGreedyExploration.Epsilon = 0.9;
agentOpts.EpsilonGreedyExploration.EpsilonDecay = 0.01;
agentOpts.CriticOptimizerOptions = qOptions;
qAgent = rlQAgent(qFunction,agentOpts); %#ok<NASGU> 

(3)训练 Q-Learning 智能体

训练智能体首先需要指定训练选项。对于此示例,使用以下选项:

  1. 最多训练 500 回合,每回合最多持续 50 个时间步长
  2. 当智能体在连续 30 回合内的平均累积奖励 >10,停止训练

更多信息请参见 rlTrainingOptions 。

trainOpts = rlTrainingOptions;
trainOpts.MaxStepsPerEpisode = 50;
trainOpts.MaxEpisodes = 500;
trainOpts.StopTrainingCriteria = "AverageReward";
trainOpts.StopTrainingValue = 13;
trainOpts.ScoreAveragingWindowLength = 30;

使用函数 Train 训练智能体,大该需要几分钟完成。为了节省时间,可以通过将 doTraining 设置为 false 来加载预训练的智能体。若要自己训练智能体,将 doTraining 设置为 true 。

doTraining = false;if doTraining% Train the agent.trainingStats = train(qAgent,env,trainOpts); %#ok<UNRCH> 
else% Load pretrained agent for the example.load("genericMDPQAgent.mat","qAgent"); 
end

在这里插入图片描述

(4)验证 Q-Learning 结果

为了验证训练结果,使用函数 sim 在 MDP 环境中模拟智能体。智能体成功地找到了最佳路径,并获得了 13 的累积奖励。

Data = sim(qAgent,env);
cumulativeReward = sum(Data.Reward)==> cumulativeReward = 13

由于折扣系数设置为 1,因此经过训练的智能体的 Q table 中的值即真实的回报。

QTable = getLearnableParameters(getCritic(qAgent));
QTable{1}==> ans = 8x2 single matrix12.9912   11.66218.2141    9.995010.8645    4.04144.8017   -1.61505.1975    8.99755.8058   -0.23530         00         0
TrueTableValues = [13,12;5,10;11,9;3,2;1,9;5,1;0,0;0,0]
==> TrueTableValues = 8×213    125    1011     93     21     95     10     00     0

1.2、在网格世界中训练智能体(Q-learning 和 SARSA)

网格世界描述如下:

  1. 网格世界大小为 5 × 5 5\times5 5×5,有四个可能的动作(North=1,South=2,East=3,West=4)
  2. 智能体从网格(2,1)出发
  3. 如果智能体到达网格(5,5),则它将获得奖励 10
  4. 网格世界中包含从网格(2,4)到网格(4,4)的跳跃,奖励为 5
  5. 智能体会被障碍物(黑色网格区域)阻挡
  6. 所有其他动作将获得奖励 -1
    在这里插入图片描述

(1)创建网格世界环境

env = rlPredefinedEnv("BasicGridWorld");

通过创建一个充值函数来指定智能体的初始状态始终为 [ 2 , 1 ] [2,1] [2,1],该函数在每次训练和模拟开始调用。

从位置[1,1]开始对状态进行编号。状态编号随着您向下移动第一列,然后向下移动后续每一列而增加。因此,创建一个匿名函数句柄,将初始状态设置为2。

固定随机数种子

rng(0)

(2)创建 Q-Learning 智能体

首先创建 Q table,然后将学习率设置为1。

qTable = rlTable(getObservationInfo(env),getActionInfo(env));
qRepresentation = rlQValueRepresentation(qTable,getObservationInfo(env),getActionInfo(env));
qRepresentation.Options.LearnRate = 1;

接下来,使用 Q-table 创建 Q-learning 智能体,并设定 ϵ \epsilon ϵ-贪婪策略。更多信息请参见 rlQAgent 和 rlQAgentOptions。

agentOpts = rlQAgentOptions;
agentOpts.EpsilonGreedyExploration.Epsilon = .04;
qAgent = rlQAgent(qRepresentation,agentOpts);

(3)训练 Q-Learning 智能体

指定以下训练选项:

  • 最多训练 200 回合,每个回合最多持续 50 个时间步长
  • 当智能体连续 20 回合平均累计奖励 >10 时,停止训练

更多的信息请参见 rlTrainingOptions

trainOpts = rlTrainingOptions;
trainOpts.MaxStepsPerEpisode = 50;
trainOpts.MaxEpisodes= 200;
trainOpts.StopTrainingCriteria = "AverageReward";
trainOpts.StopTrainingValue = 11;
trainOpts.ScoreAveragingWindowLength = 30;

使用函数 Train 来训练 Q-learning 智能体,训练可能需要几分钟才能完成。

为了在运行此示例时节省时间,可以将 doTraining 设置为 false 来加载预训练的智能体。若要自己训练智能体,可以将 doTraining 设置为 true 。

doTraining = false;if doTraining% Train the agent.trainingStats = train(qAgent,env,trainOpts);
else% Load the pretrained agent for the example.load('basicGWQAgent.mat','qAgent')
end

回合管理器窗口打开并显示训练进度。
在这里插入图片描述

(4)验证 Q-Learning 结果

plot(env)
env.Model.Viewer.ShowTrace = true;
env.Model.Viewer.clearTrace;

使用函数 sim 模拟环境中的智能体。

sim(qAgent,env)

在这里插入图片描述

(5)创建和训练 SARSA 智能体

使用与 Q-learning 智能体相同的 Q table 和 ϵ \epsilon ϵ-贪婪策略。更多信息请参见 rlSARSAAgent 和 rlSARSAAgentOptions

agentOpts = rlSARSAAgentOptions;
agentOpts.EpsilonGreedyExploration.Epsilon = 0.04;
sarsaAgent = rlSARSAAgent(qRepresentation,agentOpts);

使用函数 Train 训练 SARSA 智能体,训练可能需要几分钟才能完成。

为了在运行此示例时节省时间,可以将 doTraining 设置为 false 来加载预训练的智能体。若要自己训练智能体,可以将 doTraining 设置为 true 。

doTraining = false;if doTraining% Train the agent.trainingStats = train(sarsaAgent,env,trainOpts);
else% Load the pretrained agent for the example.load('basicGWSarsaAgent.mat','sarsaAgent')
end

在这里插入图片描述

(6)验证 SARSA 结果

plot(env)
env.Model.Viewer.ShowTrace = true;
env.Model.Viewer.clearTrace;

在环境中对智能体进行仿真。

sim(sarsaAgent,env)

在这里插入图片描述

SARSA 智能体找到与 Q-learning 智能体相同的解决方案。

1.3、创建 Simulink 环境并训练智能体

这个例子展示了如何将水箱 Simulink 模型中的 PI 控制器转换为强化学习深度确定性策略梯度(DDPG)智能体。有关在 MATLAB 中训练 DDPG 智能体的示例,请参阅 Compare DDPG Agent to LQR Controller 。

(1)水箱模型

该模型的目标是控制水箱中的水位。有关水箱模型的更多信息,请参阅 watertank Simulink Model 。
在这里插入图片描述
修改原始模型:

  1. 删除PID控制器
  2. 插入强化学习智能体模块
  3. 计算状态观测矢量 [ ∫ e d t e h ] T \left[\int\ e\ \mathrm{dt}\quad e\quad h\right]^T [ e dteh]T,其中 h h h 是水箱中的水位, e = r − h e=r−h e=rh r r r 是参考水位
  4. 设置奖励: r e w a r d = 10 ( ∣ e ∣ < 0.1 ) − 1 ( ∣ e ∣ ≥ 0.1 ) − 100 ( h ≤ 0 ∣ ∣ h ≥ 20 ) \mathrm{reward}=10\ (\ \mid e \mid<\ 0.1)\ -1\ (\ \mid e \mid\ \geq\ 0.1\ )\ -100\ (\ h\leq0\ ||\ h\geq20) reward=10 ( e∣< 0.1) 1 ( e  0.1 ) 100 ( h0 ∣∣ h20)
  5. 设置终端信号,例如仿真在 h ≤ 0 h≤0 h0 h ≥ 20 h≥20 h20 时停止。

生成的模型是 r l w a t e r t a n k . s l x \mathrm{rlwatertank.slx} rlwatertank.slx。有关此模型和更改的详细信息,请参见 Create Custom Simulink Environments 。

open_system("rlwatertank")

在这里插入图片描述

(2)创建环境

环境模型的创建包括以下内容:

  • 智能体与环境交互的动作信号和状态观测信号。有关详细信息,请参见 rlNumericSpec 和 rlFiniteSetSpec
  • 智能体用来衡量其结果好坏的奖励信号。有关详细信息,请参见 Define Reward and Observation Signals in Custom Environments

定义状态观测明细 o b s I n f o \mathrm{obsInfo} obsInfo 和动作明细 a c t I n f o \mathrm{actInfo} actInfo

% Observation info
obsInfo = rlNumericSpec([3 1],...LowerLimit=[-inf -inf 0  ]',...UpperLimit=[ inf  inf inf]');% Name and description are optional and not used by the software
obsInfo.Name = "observations";
obsInfo.Description = "integrated error, error, and measured height";% Action info
actInfo = rlNumericSpec([1 1]);
actInfo.Name = "flow";

创建环境对象。

env = rlSimulinkEnv("rlwatertank","rlwatertank/RL Agent",...obsInfo,actInfo);

设置一个自定义重置函数,使模型的参考值随机化。

env.ResetFcn = @(in)localResetFcn(in);

指定仿真时间 T f T_f Tf和智能体采样时间 T s T_s Ts(单位为秒)。

Ts = 1.0;
Tf = 200;

设置随机数种子。

rng(0)

(3)创建 Critic

DDPG 智能体使用参数化动作价值函数来评估策略,它以当前状态观测和动作作为输入,输出单个标量(估计的未来折扣累积奖励)。

要在 critic 中对参数化动作价值函数进行建模,使用具有两个输入层(一个用于 o b s I n f o \mathrm{obsInfo} obsInfo 指定的状态观测通道,另一个用于 a c t I n f o \mathrm{actInfo} actInfo 指定的动作通道)和一个输出层( 返回标量值 )的神经网络。

将每条网络路径定义为层对象数组。为每个路径的输入和输出层指定名称。通过这些名称,可以连接各路径,然后将网络输入层和输出层与相应的环境通道明确关联。从 o b s I n f o \mathrm{obsInfo} obsInfo a c t I n f o \mathrm{actInfo} actInfo 明细中获取状态观测空间和动作空间的维度。

% Observation path
obsPath = [featureInputLayer(obsInfo.Dimension(1),Name="obsInLyr")fullyConnectedLayer(50)reluLayerfullyConnectedLayer(25,Name="obsPathOutLyr")];% Action path
actPath = [featureInputLayer(actInfo.Dimension(1),Name="actInLyr")fullyConnectedLayer(25,Name="actPathOutLyr")];% Common path
commonPath = [additionLayer(2,Name="add")reluLayerfullyConnectedLayer(1,Name="QValue")];criticNetwork = layerGraph();
criticNetwork = addLayers(criticNetwork,obsPath);
criticNetwork = addLayers(criticNetwork,actPath);
criticNetwork = addLayers(criticNetwork,commonPath);criticNetwork = connectLayers(criticNetwork, ..."obsPathOutLyr","add/in1");
criticNetwork = connectLayers(criticNetwork, ..."actPathOutLyr","add/in2");

查看 Critic 网络配置。

figure
plot(criticNetwork)

在这里插入图片描述
将网络转换为 dlnetwork 对象并汇总其属性。

criticNetwork = dlnetwork(criticNetwork);
summary(criticNetwork)==>  Initialized: trueNumber of learnables: 1.5kInputs:1   'obsInLyr'   3 features2   'actInLyr'   1 features

指定的深度神经网络、环境明细对象、网络输入与状态观测和动作通道相关联的名称,创建 Critic 对象。
C

critic = rlQValueFunction(criticNetwork, ...obsInfo,actInfo, ...ObservationInputNames="obsInLyr", ...ActionInputNames="actInLyr");

有关 Q-value 函数的更多信息,请参阅 rlQValueFunction 。

用随机输入的状态观测和动作来检查 Critic。

getValue(critic, ...{rand(obsInfo.Dimension)}, ...{rand(actInfo.Dimension)})==> ans = single-0.1631

有关创建 Critics 的详细信息,请参见 Create Policies and Value Functions 。

(4)创建 Actor

DDPG 智能体在连续动作空间上使用参数化的确定性策略,该策略由连续的确定性 Actor 学习。

Actor 将当前状态观测作为输入,返回动作作为输出。

对 Actor 进行建模,需使用具有一个输入层(如 o b s I n f o \mathrm{obsInfo} obsInfo 所指定,接收环境状态观测通道的内容)和一个输出层(如 a c t I n f o \mathrm{actInfo} actInfo 所指定,将动作返回到环境动作通道)的神经网络。

将网络定义为层对象数组。

actorNetwork = [featureInputLayer(obsInfo.Dimension(1))fullyConnectedLayer(3)tanhLayerfullyConnectedLayer(actInfo.Dimension(1))];

将网络转换为 dlnetwork 对象并汇总其属性。

actorNetwork = dlnetwork(actorNetwork);
summary(actorNetwork)==> Initialized: trueNumber of learnables: 16Inputs:1   'input'   3 features

使用指定的深度神经网络、环境明细对象以及与状态观测通道相关联的网络输入名称,创建 Actor 对象。

actor = rlContinuousDeterministicActor(actorNetwork,obsInfo,actInfo);

更多信息,请参阅 rlContinuousDeterministicActor 。

用随机输入状态观测数据检查 Actor。

getAction(actor,{rand(obsInfo.Dimension)})==> ans = 1x1 cell array{[-0.3408]}

(5)创建 DDPG 智能体

使用指定的 Actor 和 Critic 对象创建 DDPG 智能体。

agent = rlDDPGAgent(actor,critic);

更多信息,请参阅 rlDDPGAgent 。

指定智能体、Actor 和 Critic 。

agent.SampleTime = Ts;agent.AgentOptions.TargetSmoothFactor = 1e-3;
agent.AgentOptions.DiscountFactor = 1.0;
agent.AgentOptions.MiniBatchSize = 64;
agent.AgentOptions.ExperienceBufferLength = 1e6; agent.AgentOptions.NoiseOptions.Variance = 0.3;
agent.AgentOptions.NoiseOptions.VarianceDecayRate = 1e-5;agent.AgentOptions.CriticOptimizerOptions.LearnRate = 1e-03;
agent.AgentOptions.CriticOptimizerOptions.GradientThreshold = 1;
agent.AgentOptions.ActorOptimizerOptions.LearnRate = 1e-04;
agent.AgentOptions.ActorOptimizerOptions.GradientThreshold = 1;

或者,也可以使用 rlDDPGAgentOptions 对象指定智能体选项。

用随机输入状态观测结果检查智能体。

getAction(agent,{rand(obsInfo.Dimension)})==> ans = 1x1 cell array{[-0.7926]}

(6)训练智能体

首先要指定训练选项。本例中使用以下选项:

  1. 每次训练最多运行 5000 回合。指定每回合最多持续 ceil ( T f / T s T_f/T_s Tf/Ts) ( 即 200 )个时间步
  2. 在 "回合管理器 "对话框中显示训练进度(设置 Plots 选项),并禁用命令行显示( 将 Verbose 选项设为 false )
  3. 当智能体在连续 20 个回合中获得的平均累积奖励 > 800 时,停止训练。此时,智能体可以控制水箱中的水位

更多信息,请参阅 rlTrainingOptions 。

trainOpts = rlTrainingOptions(...MaxEpisodes=5000, ...MaxStepsPerEpisode=ceil(Tf/Ts), ...ScoreAveragingWindowLength=20, ...Verbose=false, ...Plots="training-progress",...StopTrainingCriteria="AverageReward",...StopTrainingValue=800);

使用函数 train 训练智能体。训练是一个计算密集型过程,需要几分钟才能完成。为节省运行此示例的时间,请将 doTraining 设为 false,以加载预训练过的智能体。要自己训练代理,可将 doTraining 设为 true。

doTraining = false;if doTraining% Train the agent.trainingStats = train(agent,env,trainOpts);
else% Load the pretrained agent for the example.load("WaterTankDDPG.mat","agent")
end

在这里插入图片描述

(7)验证 DDPG 智能体

根据模型仿真验证 DDPG 智能体。由于重置函数会随机化参考值,因此要固定随机数种子,以确保可重复性。

rng(1)

在环境中仿真,并将输出返回。

simOpts = rlSimulationOptions(MaxSteps=ceil(Tf/Ts),StopOnError="on");
experiences = sim(env,agent,simOpts);

在这里插入图片描述

(8)本地重置函数

function in = localResetFcn(in)% Randomize reference signal
blk = sprintf("rlwatertank/Desired \nWater Level");
h = 3*randn + 10;
while h <= 0 || h >= 20h = 3*randn + 10;
end
in = setBlockParameter(in,blk,Value=num2str(h));% Randomize initial height
h = 3*randn + 10;
while h <= 0 || h >= 20h = 3*randn + 10;
end
blk = "rlwatertank/Water-Tank System/H";
in = setBlockParameter(in,blk,InitialCondition=num2str(h));end

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

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

相关文章

每日OJ题_牛客HJ87 密码强度等级(IO型OJ)

目录 牛客HJ87 密码强度等级 解析代码 牛客HJ87 密码强度等级 密码强度等级_牛客题霸_牛客网 题目描述 密码按如下规则进行计分&#xff0c;并根据不同的得分为密码进行安全等级划分。 一、密码长度: 5 分: 小于等于4 个字符 10 分: 5 到7 字符 25 分: 大于等于8 个字符 二…

C# LINQ基础

LINQ基础 1. 入门2. 运算符流语法2.1 连续使用查询运算符2.2 使用Lambda表达式2.2.1 Lambda表达式及Func的方法签名2.2.2 Lambda表达式和元素类型2.2.3 自然排序2.2.4 其他查询运算符 3 查询表达式4 延迟执行4.1 重复执行4.2 捕获的变量4.3 延迟加载的工作原理4.4 查询语句的执…

【思考】crud接口命名规范

写代码时取名字真的是痛苦。 方法命名 1、阿里命名规范 Service/Dao 层命名规约 1&#xff09; 获取单个对象的方法用 get 做前缀。 2&#xff09; 获取多个对象的方法用 list 做前缀。 3&#xff09; 获取统计值的方法用 count 做前缀。 4&#xff09; 插入的方法用 save&am…

c++ 11 新特性 不同数据类型之间转换函数之const_cast

一.不同数据类型之间转换函数const_cast介绍 const_cast是C11中引入的一种类型转换操作符&#xff0c;用于修改类型的const或volatile属性。const_cast的主要用途是移除对象的常量性&#xff0c;它是唯一具有此能力的C风格的转型操作符。在C11中&#xff0c;const_cast可以完成…

SpringMVC拦截器和过滤器执行顺序及区别

拦截器&#xff08;Inteceptor&#xff09;和过滤器&#xff08;Filter&#xff09;执行顺序&#xff1f; 拦截器和过滤器区别&#xff1f; 1、拦截次数不同&#xff1a; 过滤器&#xff1a;一次请求只能被一个过滤器拦截一次&#xff0c;它们按照在web.xml中的声明顺序依次执…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑净负荷均衡的分布式光伏集群电压调控策略研究》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

遗传算法理解与代码实战(二)- demo(python+deap)

前文介绍了遗传算法&#xff0c;并且手动python代码进行了实践&#xff0c;但是在遇到复杂的问题时&#xff08;遗传算法理解与代码实战&#xff08;三&#xff09;会介绍&#xff09;&#xff0c;手写代码很麻烦&#xff0c;所以需要借助专门的遗传算法库来实现&#xff0c;这…

使用IAD电话交换机(语音网关)将电话外线对接到FreeSWITCH SIP服务器

在我们初步了解了FreeSWITCH这样的SIP服务器之后&#xff0c;常见的一个需求就是把真实的电信世界&#xff08;比如固话、手机&#xff09;对接到SIP服务器里。 今天我们就介绍一个简单的方法&#xff0c;在3分钟内就把电信局和你的SIP软交换机融合通信起来。 IAD和SIP服务器环…

搜维尔科技:动作捕捉与数字时尚:Wondar Studios欧莱雅项目

来自意大利的Wondar Studios工作室&#xff0c;是一家制作与动作捕捉技术相关软件和内容的公司&#xff0c;其出品的三维角色动画均由专业动捕系统真实录制制作。 我们很高兴与大家分享Wondar Studios最新的动捕项目&#xff0c;该项目带来了身临其境的虚拟现实体验。他们与巴…

AI新工具 MacOS 翻译提供翻译、润色和语法修改功能的插件;AI生成 Excel公式;Deepmind前华人员工创建视频生成工具

1: OpenAI Translator Bob Plugin macOS 平台的翻译提供翻译、润色和语法修改功能的插件 OpenAI Translator Bob Plugin是一款基于OpenAI的API&#xff0c;为用户提供翻译、润色和语法修改功能的插件。这款插件专门为macOS平台上的Bob软件设计&#xff0c;通过使用先进的Chat…

Git误操作补救错失:恢复误删的本地分支、将某个提交从一个分支复制到另一个分支

一、恢复误删的本地分支 作为一枚强迫症&#xff0c;没用的分支总是喜欢及时删删删删掉删掉统统删掉&#xff0c;结果今天发现有些分支还是应该保留。 比如&#xff0c;①前段时间切了个分支用来专门做图表&#xff0c;但因为需求还没有最终确定&#xff0c;已经上线了测试服而…

UE4 Niagara 关卡4.1官方案例解析

we now directly supporting playing audio from arbitrary locations in particle systems.users have control over volume and pitch,and the system can directly play sound waves,or sound cues which have multiple waves in them.(我们现在直接支持在粒子系统中从任意…

Python 过滤函数filter()详解

一、过滤函数定义 它用于对容器中的元素进行过滤处理。 二、 过滤函数语法 filter(function,iterable) 参数function&#xff1a;提供过滤条件的函数&#xff0c;返回布尔型 参数iterable: 容器类型数据 三、过滤函数的应用场景 1、筛选符合条件的元素 需求&#xff1a;在列表…

Paddle上手实战——NLP经典cls任务“推特文本情感13分类”

Paddle上手实战——NLP经典cls任务“推特文本情感13分类” 实战背景介绍 数据地址:https://www.heywhale.com/home/activity/detail/611cbe90ba12a0001753d1e9/content Twitter推文具备多重特性,首要之处在于其与Facebook的显著区别——其完全基于文本形式,通过Twitter接…

微软大中华区商业应用事业部高级产品经理张诗源,将出席“ISIG-低代码/零代码技术与应用发展峰会”

3月16日&#xff0c;第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导&#xff0c;企智未来科技&#xff08;LowCode低码时代、RPA中国、AIGC开放社区&#xff09;主办。大会旨在聚合每一位产业成员的力量&#xff0c;深入探索低…

JavaWeb实验 JSP 基本语法(续

实验目的 掌握JSP基本语法&#xff1b;掌握JSP常见用法。 实验内容 【1】创建index.jsp、first.jsp和second.jsp三个jsp文件&#xff0c;页面的内容分别显示“This is my JSP page of index.jsp.”、“This is my JSP page of first.jsp.”和“This is my JSP page of secon…

什么是AI智能答题?

AI智能答题是指利用人工智能&#xff08;AI&#xff09;技术&#xff0c;尤其是自然语言处理&#xff08;NLP&#xff09;和机器学习&#xff08;ML&#xff09;算法&#xff0c;来理解、分析并回答用户提出的问题的过程。这种技术可以应用于各种场合&#xff0c;包括在线教育平…

【Proteus仿真】【STM32单片机】井盖安全检测装置设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用LCD1602液晶显示模块、WIFI模块、蜂鸣器、LED按键、ADC PCF8591、角度/可燃气检测传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;LC…

如何制作一份精美的数据分析可视化报告?详细教程

在数据可视化分析的最后阶段&#xff0c;所有的分析、研究、推导以及得出的结论&#xff0c;都汇总成了一份详实的报告。这份报告不仅是对整个数据分析旅程的总结&#xff0c;更是向读者展示这段旅程所取得的成果。 那么&#xff0c;数据分析报告该如何制作呢&#xff1f;不用…

python--宣传篇--personal-qrcode个性二维码

文章目录 准备代码效果 准备 代码 from MyQR import myqr import osdef get_img_qrcode(words, save_name, picture, colorizedTrue):if save_name[-3:] in ["jpg", "png", "gif"]:if picture[-3:] in ["png", "jpg", &qu…