当前位置: 首页 > news >正文

sheng的学习笔记-AI-WaveNet模型

Ai目录:sheng的学习笔记-AI目录-CSDN博客

需要先看一下这些文章,作为基础

sheng的学习笔记-AI-残差网络-Residual Networks (ResNets)_神经网络的衰变是什么-CSDN博客

sheng的学习笔记-AI-卷积神经网络_单层卷积神经网络-CSDN博客 

sheng的学习笔记-TCN时序卷积:因果卷积、空洞卷积-CSDN博客 

论文:https://arxiv.org/pdf/1609.03499 

什么是WaveNet

WaveNet是一种生成模型。能够生成模仿任何人声的语音,并且其声音比现有最佳文本转语音系统更自然,也可以用于合成其他音频信号

允许人们与机器对话是人机交互长期以来的梦想。通过应用深度神经网络(例如,谷歌语音搜索),计算机理解自然语言的能力得到了革命性的提升。然而,用计算机生成语音——通常被称为语音合成或文本转语音(TTS)——仍然主要基于所谓的拼接式TTS,其中需要从单一说话者那里录制一个非常大的短语语音片段数据库,然后将这些片段重新组合以形成完整的语句。这使得在不录制全新数据库的情况下很难修改语音(例如切换到不同的说话者,或改变他们的语音强调或情感)。

这导致了对参数式TTS的巨大需求,其中生成数据所需的所有信息都存储在模型的参数中,语音的内容和特征可以通过模型的输入来控制。然而,迄今为止,参数式TTS听起来通常比拼接式TTS更不自然。现有的参数式模型通常通过将它们的输出传递给被称为声码器的信号处理算法来生成音频信号。

用处

  • 自动生成的钢琴曲(音乐)
  • 根据文本生成语音
  • 根据输入语音输出相同音色的语音(张三的输入,会有张三声音的输出,李四的输入,会有李四声音的输出)。
  • 语音识别

原理

WaveNet是Google DeepMind 提出的一种Neural Vocoder 架构,模型主体为一个基于空洞因果卷积(Dilated Causal Convolution)的概率模型。

即基于Condition(Mel Spectrogram),以及之前时间节点的语音生成一个概率分布,再采样得到下一采样点。反复执行该步骤,最后得到完整语音。

模型的核心是 对给定的输入序列(x_1, x_2, x_3, x_4, ..., x_n) , 每次要根据之前的x_1 ~ x_n来预测x_n+1。然后将x_n+1添加在输入序列,再由x_2 ~ x_n+1得到 x_n+2

由此 我们就可以由一个原始的序列(x_1, x_2, x_3, x_4, ..., x_n) 作为输入,按此模型进行构建,可以生成任意长度的序列!

架构图和解释

架构图

空洞因果卷积(Dilated Causal Convolution)

为了处理原始音频生成所需的长期时间依赖性,采用基于空洞因果卷积的架构,这些架构展示了非常大的感受野。具有因果卷积的模型没有递归连接,它们通常比RNN训练得更快,特别是当应用于非常长的序列时。

空洞因果卷积,具体见文章sheng的学习笔记-TCN时序卷积:因果卷积、空洞卷积-CSDN博客

根据这种空洞因果卷积,可以扩大视野,提取输入的特征,但是有较小的计算成本

需要注意的就是,wavenet的卷积层的设计是有一定的规律的,即每一层的膨胀率是上一层的两倍,也就是深度越深则空洞越多,当达到512的时候重复循环,例如其dilated rate如下:

124, . . . , 512124, . . . , 512124, . . . , 512;

然后是比较重要的部分,这样的网络设计,即1,2,4.。。。512,这样的设计可以近似看作是使用了1*1024的大小的卷积核(之所以说是近似,是因为并不是真正的对1024个维度的数据做直接计算的,而是通过多层的结构设计间接的对1024维的数据做计算的),但是确更高效(参数量更少),具有更强的非线性拟合能力。通过堆叠这些块可以进一步增大模型的容量以及感受野的大小;

网络中就没有池化层

softmax层作为输出层

wavenet最初用于解决音频问题,使用softmax层作为输出层,如果不是为了解决音频问题,可以修改最后的输出层

对个别音频样本的p(xt | x1, ..., xt-1)的条件分布进行建模的一种方法是使用混合模型,如混合密度网络或条件高斯比例混合。然而,试验表明,softmax分布往往效果更好,即使数据是隐式连续的(如图像像素强度或音频样本值)。其中一个原因是分类分布更灵活,可以更容易地模拟任意分布,因为它不对它们的形状做任何假设。

由于原始音频通常存储为16位整数值序列(每个时间步一个),softmax层需要每个时间步输出65,536个概率来模拟所有可能的值。为了使这更易于管理,我们首先对数据应用µ-law压缩变换,然后将其量化为256个可能的值:

其中-1 < xt < 1 和 µ = 255。这种非线性量化比简单的线性量化方案产生更好的重建。特别是对于语音,发现量化后的重建信号听起来与原始信号非常相似。

残差连接/跳过连接

 残差网路具体内容参考sheng的学习笔记-AI-残差网络-Residual Networks (ResNets)_神经网络的衰变是什么-CSDN博客

整个网络都使用了残差(He et al., 2015)和参数化跳跃连接,以加快收敛并使训练更深层的模型成为可能。架构图中,展示了模型的一个残差块,它在网络中被堆叠了许多次。

然后就是上面的residual block的不断地叠加,每一个residual block的输入都是上一层的输出;

每一层都有一部分网络结构直接进行skip connnection接入右边的常规的网络结构;

门控激活单元

使用了与门控PixelCNN相同的门控激活单元:

其中*表示卷积运算符,⊙表示元素乘法运算符,σ(·)是sigmoid函数,k是层索引,f和g分别表示滤波器和门控,W是可学习的卷积滤波器。

这种非线性对于模拟音频信号比修正线性激活函数效果更好

膨胀卷积的输出并没有直接通过relu而是通过了tanh和sigmoid两个分支之后进行了multiply,这是一个门控激活单元,通过这种方式来调节来自膨胀卷积的信息流,这和LSTM或GRU中使用的门控机制几乎一样,因为这些模型使用相同样式的信息门控来控制对其单元状态的调整。(例如历史的某个时刻对目标的预测完全没有帮助,模型通过这种机制可以具有辨别的能力,即完全无关的噪声则输入门保持关闭)

模型的输入和输出有相同的维度

模型的输入和输出具有相同的维度,这个通过卷积的casual的padding方式就可以了

对于这一点,进行个举例:

对于一个序列 “我是超级大帅哥”。 假如取长度为2 步长为1 作为数据进行输入和训练。

  则训练时第一次输入模型的数据:x1 = 我是 , 输出y1 = 是超

  第二次:x2 =  是超, y2 = 超级;

  第三次: x3 = 超级, y3 = 级大

  ……

  而当训练完毕,使用训练好的模型生成数据时,送入x1 = 我是,理想情况是得到y1 = 是超

  只要不断的将输出送到输入再进行预测,就有可能得到一个完整的序列“我是超级大帅哥”! 

条件wavenet

给定额外的输入h,WaveNets可以模拟给定这个输入的音频的条件分布p(x | h)。方程(1)现在变为

通过将模型条件于其他输入变量,我们可以引导WaveNet的生成以产生具有所需特征的音频。例如,在多说话者设置中,我们可以通过将说话者身份作为额外输入提供给模型来选择说话者。类似地,对于TTS,我们需要将有关文本的信息作为额外输入。

我们在两种不同的方式中对模型进行其他输入的条件:全局条件和局部条件。全局条件的特点是单个潜在表示h影响所有时间步的输出分布,例如TTS模型中的说话者嵌入。方程(2)中的激活函数现在变为:

其中V*,k是可学习的线性投影,向量V^T*,kh在时间维度上广播

对于局部条件,我们有一个第二个时间序列ht,可能比音频信号的采样频率低,例如TTS模型中的语言特征。我们首先使用转置卷积网络(学习上采样)将其转换为与音频信号相同分辨率的新时间序列y = f(h),然后在激活单元中使用: 

其中Vf,k * y现在是一个1×1卷积。作为转置卷积网络的替代方案,也可以使用Vf,k*h并在时间上重复这些值。我们在实验中发现这种方法效果稍差。 

wavenet和tcn对比

这两者都是基于空洞因果卷积实现的,但是还是有些不同

网络结构设计

WaveNet

  • 核心架构: 基于 因果卷积(Causal Convolution)扩张卷积(Dilated Convolution)
  • 目标领域: 初始是为生成语音波形设计的生成模型。
  • 递归性: WaveNet 在输出时依赖于序列的因果关系(当前输出只依赖过去的输入),这使它适合生成任务(如语音生成)。
  • 输出层: 使用概率分布建模(如 softmax),可以逐步生成每个时间步的值。

TCN

  • 核心架构: 由多个堆叠的因果卷积层组成,每层通常使用扩张卷积(Dilated Convolution)以增大感受野。
  • 目标领域: 通用时间序列建模(如分类和回归任务),并被广泛用于替代 RNN/LSTM。
  • 递归性: 非生成模型。TCN 会直接处理整个序列,不像 WaveNet 那样逐步生成。
  • 输出层: 常用于分类或回归任务,输出整个序列的预测值或单一预测值。

应用场景

WaveNet

  • 语音生成: 用于 TTS(语音合成)和语音增强等。
  • 音频建模: 高度灵活的生成式模型,适合高质量音频建模。

TCN

  • 时间序列预测: 用于分类、回归任务,如股票预测、心电图分析等。
  • 事件检测: 提取时间序列特征以进行动作或事件识别。

时间处理方式

WaveNet

  • 逐步生成输出,因此适合生成式任务,但训练和推理可能较慢。
  • 深度网络需要大量计算资源。

TCN

  • 一次性处理整个输入序列,通常更快,训练时也能利用并行化优势。

实现参考代码

import os
import sys
import time
import numpy as np
from keras.callbacks import Callback
from scipy.io.wavfile import read, write
from keras.models import Model, Sequential
from keras.layers import Convolution1D, AtrousConvolution1D, Flatten, Dense, \Input, Lambda, merge, Activationdef wavenetBlock(n_atrous_filters, atrous_filter_size, atrous_rate):def f(input_):residual = input_tanh_out = AtrousConvolution1D(n_atrous_filters, atrous_filter_size,atrous_rate=atrous_rate,border_mode='same',activation='tanh')(input_)sigmoid_out = AtrousConvolution1D(n_atrous_filters, atrous_filter_size,atrous_rate=atrous_rate,border_mode='same',activation='sigmoid')(input_)merged = keras.layers.Multiply()([tanh_out, sigmoid_out])skip_out = Convolution1D(1, 1, activation='relu', border_mode='same')(merged)out = keras.layers.Add()([skip_out, residual])return out, skip_outreturn fdef get_basic_generative_model(input_size):input_ = Input(shape=(input_size, 1))A, B = wavenetBlock(64, 2, 2)(input_)skip_connections = [B]for i in range(20):A, B = wavenetBlock(64, 2, 2**((i+2)%9))(A)skip_connections.append(B)net = keras.layers.Add()(skip_connections)net = Activation('relu')(net)net = Convolution1D(1, 1, activation='relu')(net)net = Convolution1D(1, 1)(net)net = Flatten()(net)net = Dense(input_size, activation='softmax')(net)model = Model(input=input_, output=net)model.compile(loss='categorical_crossentropy', optimizer='sgd',metrics=['accuracy'])model.summary()return modeldef get_audio(filename):sr, audio = read(filename)audio = audio.astype(float)audio = audio - audio.min()audio = audio / (audio.max() - audio.min())audio = (audio - 0.5) * 2return sr, audiodef frame_generator(sr, audio, frame_size, frame_shift, minibatch_size=20):audio_len = len(audio)X = []y = []while 1:for i in range(0, audio_len - frame_size - 1, frame_shift):frame = audio[i:i+frame_size]if len(frame) < frame_size:breakif i + frame_size >= audio_len:breaktemp = audio[i + frame_size]target_val = int((np.sign(temp) * (np.log(1 + 256*abs(temp)) / (np.log(1+256))) + 1)/2.0 * 255)X.append(frame.reshape(frame_size, 1))y.append((np.eye(256)[target_val]))if len(X) == minibatch_size:yield np.array(X), np.array(y)X = []y = []def get_audio_from_model(model, sr, duration, seed_audio):print 'Generating audio...'new_audio = np.zeros((sr * duration))curr_sample_idx = 0while curr_sample_idx < new_audio.shape[0]:distribution = np.array(model.predict(seed_audio.reshape(1,frame_size, 1)), dtype=float).reshape(256)distribution /= distribution.sum().astype(float)predicted_val = np.random.choice(range(256), p=distribution)ampl_val_8 = ((((predicted_val) / 255.0) - 0.5) * 2.0)ampl_val_16 = (np.sign(ampl_val_8) * (1/256.0) * ((1 + 256.0)**abs(ampl_val_8) - 1)) * 2**15new_audio[curr_sample_idx] = ampl_val_16seed_audio[:-1] = seed_audio[1:]seed_audio[-1] = ampl_val_16pc_str = str(round(100*curr_sample_idx/float(new_audio.shape[0]), 2))sys.stdout.write('Percent complete: ' + pc_str + '\r')sys.stdout.flush()curr_sample_idx += 1print 'Audio generated.'return new_audio.astype(np.int16)class SaveAudioCallback(Callback):def __init__(self, ckpt_freq, sr, seed_audio):super(SaveAudioCallback, self).__init__()self.ckpt_freq = ckpt_freqself.sr = srself.seed_audio = seed_audiodef on_epoch_end(self, epoch, logs={}):if (epoch+1)%self.ckpt_freq==0:ts = str(int(time.time()))filepath = os.path.join('output/', 'ckpt_'+ts+'.wav')audio = get_audio_from_model(self.model, self.sr, 0.5, self.seed_audio)write(filepath, self.sr, audio)if __name__ == '__main__':n_epochs = 2000frame_size = 2048frame_shift = 128sr_training, training_audio = get_audio('train.wav')# training_audio = training_audio[:sr_training*1200]sr_valid, valid_audio = get_audio('validate.wav')# valid_audio = valid_audio[:sr_valid*60]assert sr_training == sr_valid, "Training, validation samplerate mismatch"n_training_examples = int((len(training_audio)-frame_size-1) / float(frame_shift))n_validation_examples = int((len(valid_audio)-frame_size-1) / float(frame_shift))model = get_basic_generative_model(frame_size)print 'Total training examples:', n_training_examplesprint 'Total validation examples:', n_validation_examplesaudio_context = valid_audio[:frame_size]save_audio_clbk = SaveAudioCallback(100, sr_training, audio_context)validation_data_gen = frame_generator(sr_valid, valid_audio, frame_size, frame_shift)training_data_gen = frame_generator(sr_training, training_audio, frame_size, frame_shift)model.fit_generator(training_data_gen, samples_per_epoch=3000, nb_epoch=n_epochs, validation_data=validation_data_gen,nb_val_samples=500, verbose=1, callbacks=[save_audio_clbk])print 'Saving model...'str_timestamp = str(int(time.time()))model.save('models/model_'+str_timestamp+'_'+str(n_epochs)+'.h5')print 'Generating audio...'new_audio = get_audio_from_model(model, sr_training, 2, audio_context)outfilepath = 'output/generated_'+str_timestamp+'.wav'print 'Writing generated audio to:', outfilepathwrite(outfilepath, sr_training, new_audio)print '\nDone!'

参考文章:

https://deepmind.google/discover/blog/wavenet-a-generative-model-for-raw-audio/

一文带你读懂深度学习之Deepmind WaveNet模型和Keras实现 - SeanLiao - 博客园

自回归生成网络--WaveNet-CSDN博客 

https://zhuanlan.zhihu.com/p/331697287

相关文章:

sheng的学习笔记-AI-WaveNet模型

Ai目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 需要先看一下这些文章&#xff0c;作为基础 sheng的学习笔记-AI-残差网络-Residual Networks (ResNets)_神经网络的衰变是什么-CSDN博客 sheng的学习笔记-AI-卷积神经网络_单层卷积神经网络-CSDN博客 sheng的学习笔记-T…...

0002.基于springboot +layui二手物品交易平台

适合初学同学练手项目&#xff0c;部署简单&#xff0c;代码简洁清晰&#xff1b; 注:当前项目架构使用前后端未分离哦&#xff01; 一、系统架构 前端&#xff1a;layui| html 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk1.8 | mysql | maven 二、代…...

java集合基础

Java的java.util包主要提供了以下三种类型的集合&#xff1a; List&#xff1a;一种有序列表的集合&#xff0c;例如&#xff0c;按索引排列的Student的List&#xff1b;Set&#xff1a;一种保证没有重复元素的集合&#xff0c;例如&#xff0c;所有无重复名称的Student的Set&…...

如何在NGINX中实现基于IP的访问控制(IP黑白名单)?

大家好&#xff0c;我是锋哥。今天分享关于【如何在NGINX中实现基于IP的访问控制&#xff08;IP黑白名单&#xff09;&#xff1f;】面试题。希望对大家有帮助&#xff1b; 如何在NGINX中实现基于IP的访问控制&#xff08;IP黑白名单&#xff09;&#xff1f; 1000道 互联网大…...

「Mac玩转仓颉内测版51」基础篇13 - 高阶函数与闭包

本篇详细介绍高阶函数和闭包&#xff0c;这是仓颉语言中实现灵活逻辑的关键工具。高阶函数可将函数作为参数或返回值使用&#xff0c;而闭包能捕获其定义域中的变量&#xff0c;并在后续调用中保持状态。这些概念能让代码更加简洁、灵活&#xff0c;并提升复用性。 关键词 高阶…...

如何与GPT更高效的问答

与GPT进行高效沟通的关键在于提问的方式。通过合理的提问技巧&#xff0c;可以更清晰地表达需求&#xff0c;从而获得更准确的回答。以下是一些实用的建议&#xff0c;帮助你提升与GPT的交流效率。 1. 使用简单明了的语言&#xff1a; 尽量避免使用复杂的术语和行话&#xff0c…...

【Android】解决 ADB 中 SELinux 设置与 `Failed transaction (2147483646)` 错误

解决 ADB 中 SELinux 设置与 Failed transaction (2147483646) 错误 在使用 ADB 进行开发和调试时&#xff0c;经常会遇到由于 Android 系统安全策略&#xff08;SELinux&#xff09;引起的权限问题&#xff0c;尤其是在执行某些操作时&#xff0c;可能会遇到类似 cmd: Failur…...

etcd常用监控

通过部署etcd-exporterPrometheus&#xff0c;然后配置etcd相关告警可以及时发现etcd集群风险 常见监控项目 1. etcd集群无leader Etcd cluster have no leader - alert:EtcdNoLeaderexpr: etcd_server_has_leader 0 for:0mlabels:severity: criticalannotations:summary:Et…...

红日靶场vulnstack 7靶机的测试报告[细节](一)

目录 一、测试环境 1、系统环境 2、注意事项 3、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、Redis未授权访问漏洞获取web1靶机系统权限 3、获取docker靶机系统权限 ①Laravel框架漏洞利用getshell ②Laravel主机的提权&&docker容器逃逸 提权…...

【计算机网络】Layer4-Transport layer

目录 传输层协议How demultiplexing works in transport layer&#xff08;传输层如何进行分用&#xff09;分用&#xff08;Demultiplexing&#xff09;的定义&#xff1a;TCP/UDP段格式&#xff1a; UDPUDP的特点&#xff1a;UDP Format端口号Trivial File Transfer Protocol…...

【conda/cuda/cudnn/tensorrt】一份简洁的深度学习环境安装清单

&#x1f680;本文主要总结一下conda、cuda、cudnn、tensorrt的快速安装。至于nvidia显卡驱动的安装&#xff0c;暂且不提。本文适合有一定反复安装经验的读者&#x1f602;&#xff0c;方便其快速整理安装思路。 NVIDIA Drivers &#x1f314;01conda ⭐️ 注意&#xff0c;c…...

在C语言中,访问结构体的成员时,什么时候用`.`【符号点】,什么时候用符号`->`?

在C语言中&#xff0c;访问结构体成员时&#xff0c;使用.和->的情况取决于你是否通过结构体指针来访问。 .&#xff08;点运算符&#xff09;&#xff1a;当你有一个结构体变量时&#xff0c;使用点运算符来访问它的成员。例如&#xff1a; struct Person {char name[50];i…...

Java序列化

Java序列化 简单来说&#xff1a; 序列化是将对象的状态信息转换为可以存储或传输的形式&#xff08;如字节序列&#xff09;的过程。在 Java 中&#xff0c;通过序列化可以把一个对象保存到文件、通过网络传输到其他地方或者存储到数据库等。最直接的原因就是某些场景下需要…...

Python 方框消除小游戏

import pygame import random# 初始化pygame pygame.init()# 设置屏幕大小 screen pygame.display.set_mode((800, 600))# 设置标题 pygame.display.set_caption("打砖块")# 定义颜色 WHITE (255, 255, 255) BLACK (0, 0, 0) RED (255, 0, 0) GREEN (0, 255, 0)…...

微软 Phi-4:小型模型的推理能力大突破

在人工智能领域&#xff0c;语言模型的发展日新月异。微软作为行业的重要参与者&#xff0c;一直致力于推动语言模型技术的进步。近日&#xff0c;微软推出了最新的小型语言模型 Phi-4&#xff0c;这款模型以其卓越的复杂推理能力和在数学领域的出色表现&#xff0c;引起了广泛…...

OkHttp源码分析:分发器任务调配,拦截器责任链设计,连接池socket复用

目录 一&#xff0c;分发器和拦截器 二&#xff0c;分发器处理异步请求 1.分发器处理入口 2.分发器工作流程 3.分发器中的线程池设计 三&#xff0c;分发器处理同步请求 四&#xff0c;拦截器处理请求 1.责任链设计模式 2.拦截器工作原理 3.OkHttp五大拦截器 一&#…...

前后端跨域问题(CROS)

前端 在src中创建util文件&#xff0c;写request.js文件&#xff1a; request.js代码如下&#xff1a; import axios from axios import { ElMessage } from element-plus;const request axios.create({// baseURL: /api, // 注意&#xff01;&#xff01; 这里是全局统一加…...

ctfshow xss

1.web316 看的wp 先在服务器上写一个php文件 <?php$cookie $_GET[cookie];$time date(Y-m-d h:i:s, time());$log fopen("cookie.txt", "a");fwrite($log,$time.: . $cookie . "\n");fclose($log); ?> 获取cookie的值&#xff…...

kafka客户端调用

kafka客户端调用 springboot整合kafkajava调用kafka其他问题 springboot整合kafka 手动提交需要在配置文件配置kafka属性 kafka.listener.ack-mode: manual Component public class MyKafkaListener {Autowiredprivate SaslClient saslClient;//监听所有分区KafkaListener(top…...

Linux 中 sftp 命令基本使用

参考链接 sftp 命令_sftp命令-CSDN博客 登录服务器【必须】 # sftp userNamehost # 例如 sftp root8.138.86.224 上传文件到服务器 使用 sftp 命令可以将本地文件上传到远程主机 # put local_file remote_file # 例如&#xff1a; put E://1.mp4 /root/1.mp4 下载文件 使…...

xtu oj 3个矩形与1个正方形

文章目录 回顾前言代码思路 回顾 xtu oj 神经网络xtu oj 1167 逆序数&#xff08;大数据&#xff09;xtu oj 原根xtu oj 不定方程的正整数解xtu oj 最多的可变换字符串xtu oj String Ixtu oj 字母序列xtu oj 分段xtu oj 完全平方数IIxtu oj 连接字符串xtu oj 2021xtu oj 数字x…...

C++ 引用

引用&#xff08;Reference&#xff09;是C语言中用于给变量起别名的特性&#xff0c;是一种轻量级的变量访问方式。通过引用&#xff0c;可以对原变量进行操作而不需要直接访问原变量的内存地址。这一特性极大地增强了代码的简洁性和安全性&#xff0c;同时也在参数传递和返回…...

解决几个常见的ASP.NET Core Web API 中多线程并发写入数据库失败的问题

前言 在ASP.NET Core Web API应用程序中&#xff0c;当多个并发线程同时调用新增用户数据的接口时&#xff0c;可能会遇到数据库写入失败的问题。这个问题通常源于多个线程同时访问数据库时&#xff0c;可能会导致以下情况&#xff1a; 数据库连接池耗尽&#xff1a;每个线程…...

让知识更具生命力

在当今快速发展的技术世界中&#xff0c;技术文档的重要性不言而喻。它不仅是知识传递的有效载体&#xff0c;也是团队协作的基石&#xff0c;更是提升产品竞争力的重要工具。然而&#xff0c;编写出一份清晰、完整且实用的技术文档&#xff0c;对于许多开发者和团队来说并非易…...

批量DWG文件转dxf(CAD图转dxf)——c#插件实现

此插件可将指定文件夹及子文件夹下的dwg文件批量转为dxf文件。 &#xff08;使用方法&#xff1a;命令行输入 “netload” 加载插件&#xff0c;然后输入“dwg2dxf”运行&#xff0c;选择文件夹即可。&#xff09; 生成dxf在此新建的文件夹路径下&#xff0c;包含子文件夹内的…...

《Django 5 By Example》阅读笔记:p561-p613

《Django 5 By Example》学习第 21 天&#xff0c;p561-p613 总结&#xff0c;总计 53 页。 一、技术总结 1.mixins (1)定义(什么是 mixins?) p570&#xff0c;Mixins are a special kind of multiple inheritance for a class. (2)适用场景(为什么使用&#xff1f;) 1)…...

1. 字符串分割

给定一个非空字符串S&#xff0c;其被N个‘-’分隔成N1的子串&#xff0c;给定正整数K&#xff0c;要求除第一个子串外&#xff0c;其余的子串每K个字符组成新的子串&#xff0c;并用‘-’分隔。对于新组成的每一个子串&#xff0c;如果它含有的小写字母比大写字母多&#xff0…...

[SAP ABAP] 将内表数据转换为HTML格式

从sflight数据库表中检索航班信息&#xff0c;并将这些信息转换成HTML格式&#xff0c;然后下载或显示在前端 开发步骤 ① 自定义一个数据类型 ty_sflight 来存储航班信息 ② 声明内表和工作区变量&#xff0c;用于存储表头、字段、HTML内容和航班详细信息以及创建字段目录lt…...

计算机网络-应用层

应用层是咱们日常开发中&#xff0c;最常用到的一层 主要涉及到两种情况&#xff1a; 1.使用大佬们已经创建好的应用层协议&#xff08;后面再讨论&#xff0c;应用层知名的协议有很多&#xff0c;其中的佼佼者就是 HTTP (后面会出单独的文章来讲解)&#xff09;2.自己定义应用…...

SpringEvent 解决 WebUploader 大文件上传解耦问题

一、SpringEvent涉及的相关组件 为了让不熟悉SpringEvent的朋友对Event也有一个大致的印象。这里还是对SpringEvent对象包含的方法和相关组件的应用进行简单的介绍。 1、 事件&#xff08;Event&#xff09; 事件是应用程序中发生的某种事情&#xff0c;可以是用户行为、系统…...

KALI安装操作及过程

以下是在计算机上安装 Kali Linux 的详细教程&#xff1a;&#xff08;通常我直接使用虚拟机&#xff09; 解压虚拟机安装包&#xff0c;直接在虚拟机中打开KALI &#xff08;将内存改为4GB&#xff09; 初始密码账号&#xff1a;kali 一、准备工作 下载 Kali Linux 镜像文件…...

Scala—“==“和“equals“用法(附与Java对比)

Scala 字符串比较—""和"equals"用法 Scala 的 在 Scala 中&#xff0c; 是一个方法调用&#xff0c;实际上等价于调用 equals 方法。不仅适用于字符串&#xff0c;还可以用于任何类型&#xff0c;并且自动处理 null。 Demo&#xff1a; Java 的 在 J…...

[Flutter] : Clipboard

import package:flutter/material.dart; import package:flutter/services.dart; setData Clipboard.setData(ClipboardData(text: "传入的文字内容")); getData Clipboard.getData(Clipboard.kTextPlain) 记录 &#xff5c; Flutter剪切板-刨根问底做一个可以在后台…...

vue2:v-for实现的el-radio-group选中时显示角标,并自定义选中按钮的字体颜色和背景色

项目中需要实现一组预定义查询,每一个查询按钮在选中时右上角显示一个角标,展示当前查询返回的数据条目。 1、text-color="#3785FF" fill="#E6EAF1" 处理选中时的字体颜色和背景色,如上图,分别为蓝色和浅灰色。 2、badge中:value="selectedRadio…...

Dynamics 365 CRM- 后端

Dynamics 365 CRM 后端插件语法示例 public IPluginExecutionContext context null;//上下文 public IOrganizationServiceFactory serviceFactory null;//组织服务工厂对象 public IOrganizationService service null;//Org服务对象//创建执行上下文 context (IPluginExe…...

电脑显示器选购指南2024

选择显示器是五花八门的显示参数&#xff0c;如何选择&#xff0c;以下给出参数说明&#xff0c;及部分参考&#xff1a; 1. 尺寸和分辨率 尺寸&#xff08;英寸&#xff09; 根据使用距离和用途选择合适的屏幕尺寸&#xff1a; 21-24 英寸&#xff1a;适合小桌面空间、日常…...

机器学习-多元线性回归

文章目录 代码什么是回归任务什么是多元什么是回归什么是多元线性回归表达式何时使用多元线性回归注意损失函数 代码 https://github.com/FULLK/AI_Study/tree/main/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0-%E5%A4%9A%E5%85%83%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92 什么是回归…...

WEB语义化的新探索:浅析LLMs.txt

【引】有人迷恋使用大模型生成各种有趣的内容&#xff0c; 有人沉醉于大模型相关技术的探索&#xff0c;没有对错&#xff0c;只在于你的乐趣所在。 一项名为 llms.txt 的新提案标志了一些非同寻常的东西的出现: 一个Web网站不仅为人类读者服务&#xff0c;而且为人工智能提供服…...

【经典】制造供应链四类策略(MTS、MTO、ATO、ETO)细说

关注作者 制造供应链的牛鞭问题与复杂问题主要是从两个方面解决&#xff0c;一是同步化供应链消减从需求到供应的放大效应&#xff0c;二是供应链细分&#xff0c;针对不同的客户、不同的需求供应的匹配策略来应对复杂性&#xff0c;更好的满足客户并以最低的总成本来实现。 对…...

RabbitMQ中的Publish-Subscribe模式

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信和解耦系统的关键组件。RabbitMQ 是一个功能强大且广泛使用的开源消息代理&#xff0c;支持多种消息传递模式。其中&#xff0c;Publish/Subscribe&#xff08;发布/订阅&#xff0…...

简单了解一下 Go 语言的构建约束?

​构建约束是一种在 Go 语言中控制源文件编译条件的方法&#xff0c;它可以让您指定某些文件只在特定的操作系统、架构、编译器或 Go 版本下编译&#xff0c;而在其他环境中自动忽略。这样可以方便您针对不同的平台或场景编写不同的代码&#xff0c;实现条件编译的功能。 构建…...

图像融合算法笔记2024 CDTNet

目录 ControlCom-Image-Composition CDTNet-High-Resolution-Image-Harmonization 依赖项: trilinear 效果图: 推理代码ok 只支持linux系统: ControlCom-Image-Composition CDTNet-High-Resolution-Image-Harmonization 开源地址: GitHub - bcmi/CDTNet-High-Reso…...

我们来对接蓝凌OA --报文格式

题记 数智化办公专家、国家高新技术企业、知识管理国家标准制定者、信创供应商10强…等等&#xff0c;这些和咱们有关系吗&#xff01;&#xff01;不好意思&#xff0c;走错片场了&#xff0c;刚和项目经理在甲方那边吹牛B想想刚刚的大饼&#xff0c;看看支付宝余额&#xff…...

npm、yarn、pnpm三者的异同

这个表格将会说明一切&#xff1a; 特性npmyarnpnpm依赖管理方式扁平化管理&#xff0c;嵌套依赖树&#xff0c;可能重复安装扁平化管理喝符号链接&#xff0c;同版本只能安装一次基于硬链接喝符号链接的内容寻址存储安装速度最慢中等(并行安装)最快(得益于硬链接的复用)磁盘空…...

纯CSS实现文本或表格特效(连续滚动与首尾相连)

纯CSS实现文本连续向左滚动首尾相连 1.效果图&#xff1a; 2.实现代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, init…...

信号处理:概念、技术、领域

目录 基本概念 主要技术 应用领域 信号处理是一个涉及分析、修改和再生信号的多学科领域。信号可以是各种形式的&#xff0c;例如声音、图像、视频或其他类型的监测数据。信号处理的主要目标是提取有用的信息并增强信号的质量。以下是信号处理的一些基本概念和应用&#xff…...

Android 中 Activity 和 Fragment 的结合使用经典案例

学习笔记 0. 分析 Activity 与 Fragment 的区别&#xff0c;部分使用的差异 上一篇中我们分析了Activity 与 Fragment 的区别&#xff0c;部分使用的差异。 点我跳转上一篇 1. 单个 Activity 中使用多个 Fragment 这是最常见的用法之一&#xff0c;特别是在单屏幕应用中。通…...

Http协议在网站中的体现

文章目录 1. Http协议简介2. 网站中的体现2.1 访问网站2.2 请求2.3 请求头2.4 请求方式2.5 响应 3. 总结 1. Http协议简介 HTTP&#xff08;超文本传输协议&#xff09; 是一种广泛应用于互联网上的应用层协议&#xff0c;用于在Web浏览器和Web服务器之间传输数据。HTTP协议定…...

CTF-WEB: php-Session 文件利用 [第一届国城杯 n0ob_un4er 赛后学习笔记]

step 1 搭建容器 教程 A5rZ 题目 github.com Dockerfile 有点问题,手动修复一下 FROM php:7.2-apacheCOPY ./flag /root COPY ./readflag / COPY ./html/ /var/www/html/ COPY ./php.ini /usr/local/etc/php/php.ini COPY ./readflag /readsecretRUN chmod 755 /var/www…...

《计算机视觉:瓶颈之辩与未来之路》

一、计算机视觉的崛起 计算机视觉是使用计算机模仿人类视觉系统的科学&#xff0c;让计算机拥有类似人类提取、处理、理解和分析图像以及图像序列的能力。它是一个多学科交叉的领域&#xff0c;与机器视觉、图像处理、人工智能、机器学习等领域密切相关。 计算机视觉行业可分为…...