详解HMM模型原理 及 实现(之四:matlab实现曲线分类)

HMM隐马尔科夫模型及MATLAB实现 隐马尔科夫模型 文章目录隐马尔科夫模型前言一、定义二、三个基本问题1、观测序列概率2、模型参数学习3、预测(解码)问题总结 前言 隐马尔科夫模型(HMM)是在马尔科夫链上的一个扩展,属于机器学习,它用来描述一个含有隐含未知参数的马尔可夫过程。其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析 一、定义 隐状态集合:Q={q1,q2,…,qN} 可观测态集合:V={v1,v2,…,vN} 状态序列:I={i1,i2,…,iN} 观察态序列:O={o1,o2,…,oN} 状态转 阅读详情

本文详解paper “A Tutorial on HMMs and Selected Applications in Speech Recognition"并进行matlab实现(尽量用其他编程语言通用的实现)
**为方便阅读代码,注释部分用python的”#"

实现HMM模型用于简单的曲线分类
先定义HMM变量
曲线在T个时刻取值
observation定义为曲线可以取的值,这里先把曲线做归一化,然后从0到1之间以0.1为间隔切为10个区间,依次标号1到10,那么observation就有10个,为1到10的值
train_data定义为训练的曲线集,集中到一个矩阵,每行为一个observation序列,行数为train_data的数量
N为state数,这里设为5

   maxIter = 100;  #迭代次数
   N = 5; #number of states
   M = 10; #number of observations
   T = size(train_data, 2);  #training data列数应一致

初始化HMM参数,可以用均匀分布,也可以用随机数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里pai和A用均匀分布,B用随机分布

   pai = 1/N * ones(N,1);
   A = 1/N * ones(N,N);  #state transition matrix
   B = rand(N,M); #row: states, col: observations

初始化计算过程中的变量alpha, beta, gamma, xi
xi的size本来应该是state * state * T
但注意在计算aij时只用到了xi的1到T-1时刻求和,因此减掉一个维度T,直接定义为1到T-1时刻求和的xi, 变量定义为xi_sumT_1
在这里插入图片描述

   alpha = zeros([N, T]); #row: states, col: time, for calculating problem 1
   beta = zeros([N, T]); #row: states, col: time, for calculating problem 1
   gamma = zeros([N, T]); #row: states, col: time, for calculating problem 2
   #xi = zeros([N*N, T-1]); #row: state*state, col:time-1, for calculating problem 3 
   xi_sumT_1 = zeros(N, N); #直接对t时刻求和 row:states, col:states, for calculating problem 3
   trainNum = size(train_data, 1);

另外一些辅助变量

   iter = 1;  #迭代次数计数器
   converged = 0; #0:未收敛 1:收敛
   previous_loglik = -inf; #记录前一次likelihood
   converge_thres = 1e-4; #判断收敛的阈值

HMM设计的3个基本问题:

  1. 给定一个HMM模型,一个观测信号序列,估计出序列的概率
    给出observation序列, 模型lambda=(A,B,pi), 计算P(O | lambda)
    即模型与Observation有多匹配
  2. 决定最好的模型states
    给出observation序列,模型lambda=(A,B,pi), 选择state序列Q=q1q2…qT
    即探索隐性状态
  3. 调整模型参数来最好地解释观测到的信号
    调整lamba=(A,B,pi)使P(O | lambda)最大
    即用observation进行训练

这里要训练的HMM模型是用来识别曲线的,每个曲线类型都要训练一个模型(problem3),而后输入测试曲线,计算在每个模型下的概率(problem1),概率最大的为匹配类型,达到分类效果
每个类型的模型训练都是相同的方法,因此具体写一个类型的train_data

problem3中需要用到的变量为xi
在这里插入图片描述
而计算xi需要用到状态转移矩阵A,state下observation概率矩阵b, problem1中的alpha和beta
state下observation概率矩阵b的计算:
根据state下observation概率矩阵B
给定一个训练曲线,这个曲线在1到T时刻有值,取值范围在observation内
那么根据每个时刻t处的observation, 和指定的state,可以在B矩阵中查找到概率,可以知道b的size为state * T, 例如state为j, 时刻t时的值为bj(Ot)

for t=1:T
  b(:,t) = B(:, train_data(t));
end

计算alpha:
在这里插入图片描述

alpha(:, 1) = pai(:).*b(:,1);
#for j = 1:N  #loop j:state
   for t = 1:T-1  
      #alpha(j, t+1) = (A(:,j)'*alpha(:,t)).*B(j,tCurve(t));  #论文中公式 
      #A的每一行是Sj->S1~SN的概率,转置后每行是S1~SN->Sj的概率
      alpha(:, t+1) = A' * alpha(:,t).* b(:,t+1); #简化版         
    end
#end
loglik = log(sum(alpha(:,T))); #公式中没有log

beta:
在这里插入图片描述
在这里插入图片描述

beta = zeros(N, T);
beta(:,T) = ones(N,1); #时刻T的beta初始化为1
for t = T-1:-1:1
     #注释部分为论文中公式
     #for i = 1:N
         #tmp_sum = 0;
         #for j = 1:N
             #tmp_sum = A(i,j) * (b(j, t+1) .* beta(j, t+1));
         #end
         #beta(i, t) = tmp_sum;
         beta(:, t) = A * (b(:, t+1).*beta(:,t+1));
         beta(:,t) = normalise(beta(:,t)); #归一化
      #end
end

计算xi
xi的size本来应该是state * state * T
但注意在计算aij时只用到了xi的1到T-1时刻求和,因此减掉一个维度T,直接定义为1到T-1时刻求和的xi, 变量定义为xi_sumT_1
在这里插入图片描述
在这里插入图片描述

   xi_sumT_1 = zeros(N, N);
   
   for t = 1:T-1   
      pro = 0;
      tmp = zeros(N, N);
      for i = 1:N
         for j = 1:N
           tmp(i, j) = alpha(i, t) * A(i,j) * b(j,t+1) * beta(j, t+1);
           pro = pro + tmp(i, j);
         end
      end
      xi_sumT_1 = xi_sumT_1 + tmp./pro;
   end

简化为矩阵计算

for t = 1:T-1
   tmp = beta(:,t+1) .* b(:,t+1);
   xi_sumT_1 = xi_sumT_1 + normalise((A .* (alpha(:,t) * tmp')));
end

计算gamma
在这里插入图片描述
且
在这里插入图片描述

for t = 1:T
   #归一化满足概率条件
   gamma(:,t) = normalise(alpha(:,t) .* beta(:,t));
end

都计算完以后,可以为更新参数做准备,为什么说是做准备,因为如下公式中都是期望值,就是要遍历完一次所有的train_data后求出期望值,然后更新参数供下一次迭代使用
在这里插入图片描述
先求期望值,每做完一个train_data(i)求一次

exp_num_pai = exp_num_pai + gamma(:,1); #更新pai(初始状态概率)

gamma_sumT_1 = sum(gamma(:,1:T-1), 2); #按行求和,即1:T-1的gamma求和
exp_num_A = exp_num_A + xi_sumT_1 ./repmat(gamma_sumT_1, [1,5]);

gamma_sumT = sum(gamma, 2); #按行求和,即1:T的gamma求和
#更新B矩阵(state对应的observation的概率矩阵)
for obs=1:M   #每个observation
    ndx = find(train_data(i)==obs);
    if ~isempty(ndx)               
       exp_num_B(:,obs) = exp_num_B(:,obs) + sum(gamma(:, ndx), 2)./gamma_sumT; 
    end
end

当遍历完一次所有的train_data后,更新HMM参数,为满足概率和为1的条件,要归一化

pai = normalise(exp_num_pai);
A = mk_stochastic(exp_num_A); #每行归一化
B = mk_stochastic(exp_num_B);  #每行归一化

这样细节部分完成了,再完成整体训练流程如下

   #Training process..
   while(iter <= maxIter && ~converged)
       disp(['iteration ', num2str(iter)]);
       
       exp_num_A = zeros(N,N); #用于求A的期望值 M step
       exp_num_pai = zeros(N,1); #求gamma(1)的期望值 M step
       exp_num_B = zeros(N,M);  #用于求bj(k)矩阵的M step
       loglik = 0;
       for i = 1 : trainNum
           
           #read one curve from train_data..           
           tCurve = train_data(i, :);
                      
           #calculate bj(k) from B
           b = calObsLik(tCurve, B);
           
           #calculate alpha..
           [alpha, currLik] = calAlpha(alpha, pai, A, b, tCurve);
           
           #calculate beta..
           beta = calBeta(beta, A, b, T, N, tCurve);
           
           #calculate xi..
           xi_sumT_1 = calXi(xi_sumT_1, alpha, beta, A, b, N, T);
           
           #calculate gamma..
           gamma = calGamma(gamma, alpha, beta, N, T);
          
           gamma_sumT_1 = sum(gamma(:,1:T-1), 2); #按行求和,即1:T-1的gamma求和
           gamma_sumT = sum(gamma, 2); #按行求和,即1:T的gamma求和
           
           loglik = loglik +  currLik;
           exp_num_pai = exp_num_pai + gamma(:,1); #更新pai(初始状态概率)
           exp_num_A = exp_num_A + xi_sumT_1 ./repmat(gamma_sumT_1, [1,5]); 
           
           #更新B矩阵(state对应的observation的概率矩阵)
           for o=1:M
               ndx = find(tCurve==o);
               if ~isempty(ndx)
                   exp_num_B(:,o) = exp_num_B(:,o) + sum(gamma(:, ndx), 2)./gamma_sumT; %按论文公式
               end
           end
           
       end
       #归一化参数,使满足概率和为1的条件..
       pai = normalise(exp_num_pai);
       A = mk_stochastic(exp_num_A); #每行归一化
       B = mk_stochastic(exp_num_B);  #每行归一化
       disp(['log likelihood: ', num2str(loglik)]);
       
       #判断是否收敛,收敛则停止迭代
       delta_loglik = abs(loglik - previous_loglik);
       avg_loglik = (abs(loglik) + abs(previous_loglik))/2;
       
       if (delta_loglik / avg_loglik) < converge_thres
           converged = 1; 
       end
       
       previous_loglik = loglik;
       iter = iter + 1; #迭代次数+1
   end

最后把每个类别训练好的参数保存,测试时只需要load参数,然后计算

loglik = log(sum(alpha(:,T))); #公式中没有log

看哪个类别的likelihood最大,就分到哪类

机器学习算法 10 —— HMM模型(马尔科夫链、前向后向算法、维特比算法解码、hmmlearn) 文章目录系列文章隐马尔科夫模型 HMM1 马尔科夫链1.1 简介1.2 经典举例2 HMM简介2.1 简单案例2.2 案例进阶问题二解决问题一解决问题三解决3 HMM模型基础3.1 什么样的问题需要HMM模型3.2 HMM模型的定义4 前向后向算法评估观察序列概率4.1 回顾问题一:求观测序列的概率4.2 ⽤前向算法求HMM观测序列的概率4.3 ⽤后向算法求HMM观测序列的概率5 维特⽐算法解码隐藏状态序列5.1 HMM最可能隐藏状态序列求解概述5.2 维特比算法概述6 鲍姆-韦尔奇算法简介7 HMM模型A 阅读详情

相关推荐

【机器学习】ROC曲线和RP曲线(分类算法)

1. ROC曲线1. ROC曲线ROC曲线,全称为“接收者操作特性(Receiver Operating Characteristic)”曲线,是一种反映灵敏度和特异度关系的图形工具。在机器学习和统计学中,ROC曲线常用于评估分类模型的性能。其主要特点是展示在不同分类阈值下模型的性能表现。通过调整不同的分类阈值,可以得到不同的假阳性率和真阳性率,这些点在ROC曲线中绘制出来,从而展现出模型的整体性能。AUC值(曲线下面积)则是衡量ROC曲线性能的量化指标。当模型的预测能力更好时,AUC值更高。

c___ceeee的博客 4650

MATLAB上hmm函数,【转】Matlab的HMM(隐马尔可夫模型)相关函数介绍

声明:本文主要介绍Matlab2011b中 Statistics Toolbox工具箱里与隐马尔科夫模型相关的函数及其用法(请勿与其它HMM工具箱混淆)。本文的主要内容来自Matlab 2011b的帮助文档,为作者自学笔记。水平有限,笔记粗糙,本着“交流探讨,知识分享”的宗旨,希望对HMM感兴趣的同学有些许帮助,欢迎指教,共同进步。变量说明:设有M个状态,N个符号Markov模型。TRANS:对应...

weixin_35157304的博客 949

【语音识别】基于matlab GUI HMM中文语音识别【含Matlab源码 1385期】

HMM中文语音识别 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 2615

概率论与数理统计思维导图_机器学习入门必读:6种简单实用算法及学习曲线、思维导图...

来源:大数据DT本文约3500字,建议阅读7分钟本文为你介绍掌握机器领域知识的学习曲线、技术栈以及常用框架。[ 导读 ] 大部分的机器学习算法主要用来解决两类问题——分类问题和回归问题。在本文当中,我们介绍一些简单但经典实用的传统机器学习算法,让大家对机器学习算法有一个基本的感性认识。有的人说机器学习入门并不难,有的人会觉得机器学习难以理解。那么该如何去学习机器学习这种技术与方法呢?01 机器学习...

weixin_39779467的博客 772

MATLAB实现隐马尔科夫模型(HMM)完整程序详解

HMM由以下三个核心要素构成:状态集合$ S = {s_1, s_2, \cdots, s_N} $:有限个隐藏状态。观测集合$ O = {o_1, o_2, \cdots, o_T} $:与状态序列对应的可观测输出。三类概率参数初始状态概率状态转移概率矩阵观测概率矩阵HMM可以表示为:状态转移矩阵 $ A = [a_{ij}] $ 表示从状态 $ i $ 转移到状态 $ j $ 的概率。

weixin_26850469的博客 1254

MATLAB实现的HMM天气预测GUI应用

隐马尔科夫模型(Hidden Markov Model,简称HMM)是统计模型的一种,它假设系统被一种不可见的马尔科夫过程所控制,该过程通过一系列的隐状态来影响观测序列。在HMM中,每个隐状态都关联一个概率分布,从而决定了观测到某些数据的概率。HMM作为一种强大的概率模型,在语音识别、生物信息学、自然语言处理等领域得到了广泛应用。HMM的主要优点是其强大的建模能力。尽管状态是不可见的,但通过学习观测序列,我们可以推断出可能的状态序列和模型参数。

weixin_30633869的博客 431

HMM基本原理

HMM基本原理 Markov链:如果一个过程的“将来”仅依赖“现在”而不依赖“过去”,则此过程具有马尔可夫性,或称此过程为马尔可夫过程。马尔可夫链是时间和状态参数都离散的马尔可夫过程。HMM是在Markov链的基础上发展起来的,由于实际问题比Markov链模型所描述的更为复杂,观察到的时间并不是与状态一一对应的,而是通过一组概率分布相联系,这样的模型称为HMM。HMM是双重随机过程:其...

yaningli的博客 5793

MATLAB实现HMM的孤立字语音识别实验及实战

本文还有配套的精品资源,点击获取 简介:本实验将介绍如何使用MATLAB实现基于隐马尔可夫模型的孤立字语音识别。HMM是一种广泛应用于自然语言处理和语音识别系统的技术,它基于观察序列由隐藏状态序列生成的假设。本实验涵盖HMM的基本原理、组成部分以及在语音识别中的应用,并详细讲解在MATLAB中实现该模型的步骤,包括数据预处理、模型训练、评估、识别及优化。通过此实验,学生可以...

weixin_35749786的博客 1264

MATLAB 实现基于 GMM-HMM的语音识别系统

可变性 (Variability):同一个音素(如 /a/),由不同人、在不同语境下发出,其声学特征(MFCC)是不同的。如何建模这种多样的、连续的特征?解决方案:GMM (高斯混合模型)。一个 GMM 可以非常灵活地拟合一个音素(或更小的单位,如状态)所对应的多种可能的声学特征分布,就像一个“软聚类”。时序性 (Temporal Structure):语音是一个时序信号。音素之间如何连接?一个单词的发音有其特定的音素序列。解决方案:HMM (隐马尔可夫模型)。

guygg88的博客 1222

HMM与语音识别:MATLAB实现与应用

马尔可夫模型(Hidden Markov Model,简称HMM)是一种统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。HMM广泛应用于语音识别、自然语言处理、生物信息学等领域。在HMM中,系统被看作是一个“隐藏”的马尔可夫链,其状态不可直接观测到,但可以观测到每个状态序列输出的事件。HMM的核心思想是通过观测序列来推断隐藏状态序列,或对未来的观测序列进行预测。其模型由三个基本部分组成:状态转移概率矩阵:描述了在不同时间点,系统从一个状态转移到另一个状态的概率。

weixin_34620658的博客 1145

MATLAB实现隐马尔科夫模型全解_HMM学习与应用

隐马尔科夫模型(Hidden Markov Model,HMM)是一种统计模型,用于描述一个含有隐含未知参数的马尔科夫过程。HMM是马尔科夫链和统计模型相结合的产物,广泛应用于语音识别、生物信息学、自然语言处理等领域。在HMM中,系统被认为是一个马尔科夫过程,但状态并不直接可见,而是通过观测序列间接地表现出来。马尔科夫链是随机过程的一种,其核心特征是具有无记忆性,即未来的状态只与当前状态有关,而与过去的状态无关。数学上,这个性质可以表述为:假定有一个随机过程 {X_n},它取值于状态空间 S。

weixin_32661831的博客 993

【HMM预测】隐马尔可夫模型HMM金融数据预测【含Matlab源码 13792期】

隐马尔可夫模型HMM金融数据预测 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 760

别再瞎调了!STM32 Systick延时函数避坑指南(正点原子、野火、慧净代码对比)

本文深入解析STM32 Systick延时函数的实现差异与优化策略,对比正点原子、野火、慧净等主流方案的优缺点。针对us和ms级延时精度问题,提供避坑指南和高级优化技巧,帮助开发者根据项目需求选择最佳方案,提升嵌入式系统的定时控制精度。

weixin_28717807的博客 339

【HMM预测】基于matlab隐马尔可夫模型HMM金融数据预测【含Matlab源码 13792期】

隐马尔可夫模型HMM金融数据预测 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 1092

六轴机器人正解

采用的是John H.Craig在【机器人学导论】中的改进DH模型 1.六轴坐标系 2.DH参数 i αi−1\alpha_{i-1}αi−1​ ai−1a_{i-1}ai−1​ did_idi​ θi\theta_iθi​初值 1 0 0 0 0 2 -90 a1a_1a1​ 0 -90 3 0 a2a_2a2​ 0 -90 4 -90 a3a_3a3​ d4d...

m0_37581770的博客 2511

基于LSTM GRU RNN的交通流量预测-完整数据代码

基于LSTM GRU RNN的交通流量预测-完整数据代码

921

matlab中的隐马尔可夫模型(HMM)实现

原文链接:http://tecdat.cn/?p=7960 隐马尔可夫模型(HMM)简介 隐马尔可夫模型(HMM)是一个在你观察到的输出顺序,但不知道状态序列模型产生输出的过程。隐马尔可夫模型的分析试图从观察到的数据中恢复状态序列。 例如,考虑具有两个状态和六个可能输出的马尔可夫模型。该模型使用: 红色骰子,有六个面,标记为1到6。 一个绿色骰子,具有十二个侧面,其中五............

大数据部落 3825

嵌入式视频应用开发者必读:嵌入式Linux+FFmpeg硬件编解码实战指南

在嵌入式Linux上,FFmpeg支持多种硬件加速API,比如VAAPI、VDPAU、CUDA,以及针对特定平台的专用接口(如NVIDIA的NVENC、Intel的QSV、ARM的Mali)。FFmpeg的硬件解码通过-hwaccel参数启用,咱们以常见的H.264和HEVC(H.265)格式为例,展示如何用VAAPI和V4L2实现高效解码。: FFmpeg硬件加速需要额外的库,比如libva(VAAPI)、libv4l2(V4L2)或libnvcodec(CUDA)。

大模型大数据攻城狮的专栏 2201

HMM基本原理及其实现(隐马尔科夫模型)

HMM基本原理 Markov链:如果一个过程的“将来”仅依赖“现在”而不依赖“过去”,则此过程具有马尔可夫性,或称此过程为马尔可夫过程。马尔可夫链是时间和状态参数都离散的马尔可夫过程。HMM是在Markov链的基础上发展起来的,由于实际问题比Markov链模型所描述的更为复杂,观察到的时间并不是与状态一一对应的,而是通过一组概率分布相联系,这样的模型称为HMM。HMM是双重随机过程:其中之...

xiaocao9903的专栏 2333

需求跟踪详解

需求跟踪是指在软件项目开发过程中,建立并维护需求与项目各阶段工作产物(如设计文档、代码模块、测试用例等)之间对应关系的过程。它不仅记录需求从提出到实现的完整路径,还能反映需求变更时对各阶段工作的影响范围,是连接用户期望与实际软件开发产出的桥梁。

跟佟格湾一起学习计算机知识吧~ 1421

使用GitLab的VS Code插件 GitLab Workflow 来进行项目的DevOps管理,助力研发效能

使用VS Code的GitLab Workflow插件,进行项目的DevOps管理,将效率提升到MAX。直接在VScode中管理流水线,一键跳转到创建 Issues,MR

知无涯 5290

基于HMM隐马尔可夫模型的金融数据预测算法matlab仿真

在金融数据预测中,首先根据历史数据估计HMM的参数,然后利用HMM进行状态预测(例如预测下一时刻市场状态)或者直接对未来观察值(如股价)进行预测。预测过程中,通常需要对模型进行适当的简化或改造,以适应金融市场的实际特点。

熟悉python,matlab,C,C++,JAVA等 1092

vue2/3 - element表格组件el-table实现懒加载树型(上下级)数据、默认展开和隐藏层级,支持对表格进行修改|新增|删除,解决完成操作后树节点不刷新问题(提供示例代码,一键复制开箱即用

vue2,vue3,elementui,elementPlus,el-table,Table表格组件,表格懒加载数据,element table表格数中的树形结构懒加载,增加后数据不同步更新问题,el-table树形与el-tree树形结构的一键折叠与展开,elementui中el-tree懒加载数据 默认展开最外层节点,Element-plus Table组件树表结构默认展开一级目录,vue实现element table表格树形结构-使用懒加载时-解决子节点增删改后,不刷新子节点数据问题,解决el-tre

✅ 精选推荐文章 1万+

探索序列数据的奥秘:HMM隐马尔可夫模型MATLAB实现

探索序列数据的奥秘:HMM隐马尔可夫模型MATLAB实现 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在数据科学的世界中,序列数据的分析与预测一直是研究的热点。隐马尔可夫模型(Hidden Markov Model, HMM)作为一种强大的统计建模方法,广泛应用于自然语言处理、语音识别、生物信息学等多个领域。本项目提供了一个基于MATLAB的HMM完整实现,旨在帮助...

gitblog_09702的博客 432

linux平台Modbus TCP测试

【代码】linux平台Modbus TCP测试。

无线互联&网络介绍 817

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

基于HMM的语音识别Matlab实现:项目解析与推荐

基于HMM的语音识别Matlab实现:项目解析与推荐 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在人工智能领域,语音识别技术一直是一个备受关注的热点。今天,我们要介绍的是一个开源项目——基于HMM的语音识别Matlab实现。该项目通过隐马尔可夫模型(HMM)对语音信号进行高效处理和分析,实现了语音识别的核心功能。利用Matlab这一强大的数学工具,该项目不仅为研究...

gitblog_06765的博客 973

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: 详解HMM模型 及 实现(之三:problem3)
下一篇: pytorch lstm input_size, hidden_size说明
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值