使用量桨PaddleQuantum实现有效压缩量子数据的量子自动编码器

  • 一、前置基础知识——量子世界的测量
    • 1.我们看到的世界就是真实的世界吗?
    • 2.叠加态
    • 3.量子力学逻辑基础
  • 二、量子自动编码器的实现原理
  • 三、训练数据说明
  • 四、使用PaddleQuantum实现
    • 1.安装量桨PaddleQuantum
    • 2.导入必要的package
    • 3.生成初始态
    • 4.搭建量子神经网络
    • 5.配置模型
    • 6.模型训练
    • 7.模型效果

训练量子自动编码器以压缩特定的量子态数据集,以较小的尺寸表示数据,从而有效地压缩输入。

参考资料:

  • Quantum autoencoders for efficient compression of quantum data
  • 有效压缩量子数据的量子自动编码器——Quantum autoencoders for efficient compression of quantum data论文翻译
  • 量桨——量子变分自编码器
  • 走进量子计算的大门——使用量桨PaddleQuantum创建单量子比特门
  • Paddle Quantum (量桨)入门手册

一、前置基础知识——量子世界的测量

要想弄明白量子编码器的工作原理,首先就要弄明白“测量”这一概念

1.我们看到的世界就是真实的世界吗?

人类视觉系统是这个世界上最为神奇的一个系统,但是这也许并不能说明我们的世界就是眼睛看到的样子,这个世界的本质也许不是我们看到的这样。

我们之所以能看见事物,其实是因为光,物体将光反射到我们的眼睛,我们就看到了这个物体,无形当中,我们做了一次测量,测量了所见之物的颜色、大小、形状等等…

假设我们看到的是一个苹果,因为苹果足够的大,可以用肉眼直接观察,以至于光照射到物体时,不会对物体造成本质的影响;但是,如果我们要观察一个极其微小的粒子呢,小到甚至比光粒子小,这时也许就不能说没有影响了。

再举个例子,测速。经典力学中,我们可以用很多传感器测量速度,比如红外传感器、超声波传感器等等,因为被测物较大,这些波打到被测物体上时,其影响可以忽略不计,因此,我们可以测出它的速度;但是,如果要测一个质子的速度,那就变得十分困难了,测量前后也许会对其造成不可小觑的影响。

测量到底会不会对被测物造成影响,我们看一个实验,这个实验大家应该都听过,叫薛定谔的猫。将一只猫关在装有少量镭和氰化物的密闭容器里。镭的衰变存在几率,如果镭发生衰变,会触发机关打碎装有氰化物的瓶子,猫就会死;如果镭不发生衰变,猫就存活。根据量子力学理论,由于放射性的镭处于衰变和没有衰变两种状态的叠加,猫就理应处于死猫和活猫的叠加状态。这只既死又活的猫就是所谓的“薛定谔猫”。但是,不可能存在既死又活的猫,则必须在打开容器后才知道结果。打开容器就是测量。根据经典物理学,在盒子里必将发生这两个结果之一,而外部观测者只有打开盒子才能知道里面的结果。在量子的世界里,当盒子处于关闭状态,整个系统则一直保持不确定性的波态,即猫生死叠加。猫到底是死是活必须在盒子打开后,外部观测者观测时,物质以粒子形式表现后才能确定。

2.叠加态

说了这么多,其实就想说明一点,就是量子里没有确定的事物,经典物理中的0和1在量子世界里可以是0和1的叠加态,而当我们观察它时,它就会塌缩成0或1。

经典的编码器不需要任何其他的数据,只需要对输入的特征进行提取即可,因为它不存在塌缩:

但是在量子编码器中,一旦对叠加态的量子数据进行测量,那么数据就会塌缩,测量结果与测量前可能不一致,因此,你会在量子编码器中发现经典编码器没有的参考状态,如果你明白了测量会导致塌缩,那么你应该就会明白参考状态在量子编码器里的作用。

3.量子力学逻辑基础

这个视频很好地解释了量子力学里的测量问题,希望能帮助你理解:

十分钟了解量子力学--量子计算机的基础概念

二、量子自动编码器的实现原理

量子自编码器的形式与经典自编码器非常相似,同样由编码器 E E E(encoder)和解码器 D D D(decoder)组成。对于输入的 N N N 量子比特系统的量子态 ρ i n \rho_{in} ρin(这里我们采用量子力学的密度算符表示来描述混合态),先用编码器 E = U ( θ ) E = U(\theta) E=U(θ) 将信息编码到其中的部分量子比特上。这部分量子比特记为系统 A A A。对剩余的量子比特 (这部分记为系统 B B B)进行测量并丢弃后,我们就得到了压缩后的量子态 ρ e n c o d e \rho_{encode} ρencode,压缩后的量子态维度和量子系统 A A A 的维度大小保持一致。假设我们需要 N A N_A NA 个量子比特来描述系统 A A A ,那么编码后量子态 ρ e n c o d e \rho_{encode} ρencode 的维度就是 2 N A × 2 N A 2^{N_A}\times 2^{N_A} 2NA×2NA。 这里比较特殊的是, 对应我们这一步测量并丢弃的操作的数学操作是 partial trace。读者在直观上可以理解为张量积 ⊗ \otimes 的逆运算。

我们不妨看一个具体的例子来理解。给定 N A N_A NA 个量子比特上的一个量子态 ρ A \rho_A ρAN B N_B NB 个量子比特上的一个量子态 ρ B \rho_B ρB, 那么由 A 、 B A、B AB 两个子系统构成的的整体量子系统 N = N A + N B N = N_A+ N_B N=NA+NB 的量子态就可以描述为: ρ A B = ρ A ⊗ ρ B \rho_{AB} = \rho_A \otimes \rho_B ρAB=ρAρB。现在我们让整个量子系统在酉矩阵 U U U 的作用下演化一段时间后,得到了一个新的量子态 ρ A B ~ = U ρ A B U † \tilde{\rho_{AB}} = U\rho_{AB}U^\dagger ρAB~=UρABU。 那么如果这时候我们只想得到量子子系统 A 所处于的新的量子态 ρ A ~ \tilde{\rho_A} ρA~, 我们该怎么做呢?很简单,只需要测量量子子系统 B B B 然后将其丢弃。运算上这一步由 partial trace 来完成 ρ A ~ = Tr B ( ρ A B ~ ) \tilde{\rho_A} = \text{Tr}_B (\tilde{\rho_{AB}}) ρA~=TrB(ρAB~)。在量桨上,我们可以用内置的 partial_trace(rho_AB, 2**N_A, 2**N_B, 2) 指令来完成这一运算。注意: 其中最后一个参数为 2,表示我们想丢弃量子系统 B B B 的量子态。

在讨论完编码的过程后,我们来看看如何解码。为了解码量子态 ρ e n c o d e \rho_{encode} ρencode,我们需要引入与系统 B B B 维度相同的系统 C C C 并且初始态取为 ∣ 0 … 0 ⟩ |0\dots0\rangle 00 态。再用解码器 D = U † ( θ ) D = U^\dagger(\theta) D=U(θ) 作用在整个量子系统 A + C A+C A+C 上对系统 A 中压缩的信息进行解码。我们希望最后得到的量子态 ρ o u t \rho_{out} ρoutρ i n \rho_{in} ρin 尽可能相似并用 Uhlmann-Josza 保真度 F F F (Fidelity)来衡量他们之间的相似度。

F ( ρ i n , ρ o u t ) = ( tr ⁡ ρ i n ρ o u t ρ i n ) 2 F(\rho_{in}, \rho_{out}) = \left(\operatorname{tr} \sqrt{\sqrt{\rho_{in}} \rho_{out} \sqrt{\rho_{in}}} \right)^{2} F(ρin,ρout)=(trρin

ρoutρin

)2

最后,通过优化编码器里的参数,我们就可以尽可能地提高 ρ i n \rho_{in} ρinρ o u t \rho_{out} ρout 的保真度。

总的来说,在训练算法的一次迭代中,我们对训练集中的每个状态执行以下步骤:

  1. 准备输入状态 ∣ ψ i ⟩ \left|\psi_{i}\right\rangle ψi和参考状态。
  2. 在编码酉矩阵 U p ⃗ {U^{\vec{p}}} Up 下演化,其中 p ⃗ {\vec{p}} p

    是给定优化步骤的参数集。
  3. 通过交换测试测量状态和参考状态之间的保真度。

三、训练数据说明

考虑一组状态 { ∣ ψ i ⟩ } \{\left|\psi_{i}\right\rangle\} {ψi},支持希尔伯特空间 S ⊂ H S⊂H SH的子集。使用量子自动编码器,我们可以找到一种只使用 l o g 2 ∣ S ∣ log_2^{| S |} log2S量子位来表示状态的编码方案,而不是使用 l o g 2 ∣ H ∣ log_2^{ | H |} log2H,如下图所示:

例如,考虑STO-6G最小基集中分子氢的哈密顿量。利用JW变换,作用于四个量子位的相应哈密顿量采用一般形式:

H = c 0 I + c 1 ( Z 0 + Z 1 ) + c 2 ( Z 2 + Z 3 ) + c 3 Z 0 Z 1 + c 4 ( Z 0 Z 2 + Z 1 Z 3 ) + c 5 ( Z 1 Z 2 + Z 0 Z 3 ) + c 6 Z 2 Z 3 + c 7 ( Y 0 X 1 X 2 Y 3 − X 0 X 1 Y 2 Y 3 − Y 0 Y 1 X 2 X 3 + X 0 Y 1 Y 2 X 3 ) \begin{aligned} H &=c_{0} I+c_{1}\left(Z_{0}+Z_{1}\right)+c_{2}\left(Z_{2}+Z_{3}\right)+c_{3} Z_{0} Z_{1}+ &c_{4}\left(Z_{0} Z_{2}+Z_{1} Z_{3}\right)+c_{5}\left(Z_{1} Z_{2}+Z_{0} Z_{3}\right)+c_{6} Z_{2} Z_{3} &+c_{7}\left(Y_{0} X_{1} X_{2} Y_{3}-X_{0} X_{1} Y_{2} Y_{3}-Y_{0} Y_{1} X_{2} X_{3}+X_{0} Y_{1} Y_{2} X_{3}\right) \end{aligned} H=c0I+c1(Z0+Z1)+c2(Z2+Z3)+c3Z0Z1+c4(Z0Z2+Z1Z3)+c5(Z1Z2+Z0Z3)+c6Z2Z3+c7(Y0X1X2Y3X0X1Y2Y3Y0Y1X2X3+X0Y1Y2X3)

在这种情况下,系数 c i c_i ci是核间距r的函数。通过求解不同r值下哈密顿量的薛定谔方程,我们可以得到氢分子的基态能量,并构造势能面(PES),如图6所示。我们期望沿PES的基态波函数保持相同的粒子数和投影自旋对称性,从而使这组态成为一个很好的压缩目标。

用STO-6G基组计算氢分子的势能面。红点处的基态用作量子自动编码器的训练集。

以氢分子的六个基态在不同的r, { Ψ ( r i ) } i 6 = 1 \{Ψ(r_i)\}^6_i=1 {Ψri}i6=1作为我们的训练集。在这种情况下,选择所有状态的权重都相等。

四、使用PaddleQuantum实现

下面我们通过一个简单的例子来展示量子自编码器的工作流程和原理。这里我们先安装量桨PaddleQuantum并引入必要的 package。

1.安装量桨PaddleQuantum

在本项目中,量桨的安装包已当作数据集加载进来,可以通过如下命令解压:

!unzip -oq /home/aistudio/work/Quantum-2.0.0.zip

安装量桨:

%cd Quantum-2.0.0
!pip install -e .

2.导入必要的package

from paddle import fluid# 检查飞桨Paddle是否成功安装
fluid.install_check.run_check()
Running Verify Fluid Program ...
Your Paddle Fluid works well on SINGLE GPU or CPU.
Your Paddle Fluid works well on MUTIPLE GPU or CPU.
Your Paddle Fluid is installed successfully! Let's start deep Learning with Paddle Fluid now
import numpy as np
from numpy import diag
import scipy
import scipy.stats
import paddle
from paddle import fluid
from paddle import matmul, trace, kron, real
from paddle_quantum.circuit import UAnsatz
from paddle_quantum.utils import dagger, state_fidelity, partial_trace

以上的几个代码块没有任何报错的话,恭喜你!接着就可以顺利使用量桨了!如果出现报错,可尝试重启环境或切换环境。

3.生成初始态

我们考虑 N = 3 N = 3 N=3 个量子比特上的量子态 ρ i n \rho_{in} ρin。我们先通过编码器将其信息编码到下方的两个量子比特(系统 A A A),之后对第一个量子比特(系统 B B B)测量并丢弃,之后引入一个处于 ∣ 0 ⟩ |0\rangle 0 态的量子比特(新的参考系统 C C C)来替代丢弃的量子比特 B B B 的维度。最后通过解码器,将 A 中压缩的信息复原成 ρ o u t \rho_{out} ρout。在这里,我们假设初态是一个混合态并且 ρ i n \rho_{in} ρin 的本征谱为 λ i ∈ { 0.3 , 0.2 , 0.2 , 0.1 , 0.1 , 0.1 , 0 , 0 } \lambda_i \in \{0.3, 0.2, 0.2, 0.1, 0.1, \,0.1, \,0, \,0 \} λi{0.30.20.20.10.1,0.1,0,0},然后通过作用一个随机的酉变换来生成初态 ρ i n \rho_{in} ρin

注意:这里的八个基态,其和为1: 0.3 + 0.2 + 0.2 + 0.1 + 0.1 + 0.1 + 0 + 0 = 1 0.3+0.2+0.2+0.1+0.1+0.1+0+0=1 0.3+0.2+0.2+0.1+0.1+0.1+0+0=1

N_A = 2        # 系统 A 的量子比特数
N_B = 1        # 系统 B 的量子比特数
N = N_A + N_B  # 总的量子比特数scipy.random.seed(1)                            # 固定随机种子
V = scipy.stats.unitary_group.rvs(2**N)         # 随机生成一个酉矩阵
D = diag([0.3, 0.2, 0.2, 0.1, 0.1, 0.1, 0, 0])  # 输入目标态rho的谱
V_H = V.conj().T                                # 进行厄尔米特转置
rho_in = (V @ D @ V_H).astype('complex128')     # 生成 rho_in# 初始化量子系统 C
rho_C = np.diag([1,0]).astype('complex128')

4.搭建量子神经网络

在这里,我们用量子神经网络来作为编码器和解码器。假设系统 A 有 N A N_A NA 个量子比特,系统 B B BC C C 各有 N B N_B NB 个量子比特,量子神经网络的深度为 D D D。编码器 E E E 作用在系统 A 和 B 共同构成的总系统上,解码器 D D D 作用在 A A AC C C 共同构成的总系统上。在我们的问题里, N A = 2 N_{A} = 2 NA=2N B = 1 N_{B} = 1 NB=1

# 设置电路参数
cir_depth = 6                        # 电路深度
block_len = 2                        # 每个模组的长度
theta_size = N*block_len*cir_depth   # 网络参数 theta 的大小# 搭建编码器 Encoder E
def Encoder(theta):# 用 UAnsatz 初始化网络cir = UAnsatz(N)# 搭建层级结构:for layer_num in range(cir_depth):for which_qubit in range(N):cir.ry(theta[block_len*layer_num*N + which_qubit], which_qubit)cir.rz(theta[(block_len*layer_num + 1)*N + which_qubit], which_qubit)for which_qubit in range(N-1):cir.cnot([which_qubit, which_qubit + 1])cir.cnot([N-1, 0])return cir.U

5.配置模型

在这里,定义的损失函数为:

L o s s = 1 − ⟨ 0...0 ∣ ρ t r a s h ∣ 0...0 ⟩ Loss = 1 - \langle 0...0|\rho_{trash}|0...0\rangle Loss=10...0ρtrash0...0

其中 ρ t r a s h \rho_{trash} ρtrash 是经过编码后丢弃的 B B B 系统的量子态。接着我们通过飞桨训练量子神经网络,最小化损失函数。如果损失函数最后达到 0,则输入态和输出态完全相同。这就意味着我们完美地实现了压缩和解压缩,这时初态和末态的保真度为 F ( ρ i n , ρ o u t ) = 1 F(\rho_{in}, \rho_{out}) = 1 F(ρin,ρout)=1

# 超参数设置
N_A = 2        # 系统 A 的量子比特数
N_B = 1        # 系统 B 的量子比特数
N = N_A + N_B  # 总的量子比特数
LR = 0.2       # 设置学习速率
ITR = 100      # 设置迭代次数
SEED = 15      # 固定初始化参数用的随机数种子class NET(paddle.nn.Layer):def __init__(self, shape, dtype='float64'):super(NET, self).__init__()# 将 Numpy array 转换成 Paddle 中支持的 Tensorself.rho_in = paddle.to_tensor(rho_in)self.rho_C = paddle.to_tensor(rho_C)self.theta = self.create_parameter(shape=shape,default_initializer=paddle.nn.initializer.Uniform(low=0.0, high=2 * np.pi),dtype=dtype, is_bias=False)# 定义损失函数和前向传播机制def forward(self):# 生成初始的编码器 E 和解码器 DE = Encoder(self.theta)E_dagger = dagger(E)D = E_daggerD_dagger = E# 编码量子态 rho_inrho_BA = matmul(matmul(E, self.rho_in), E_dagger)# 取 partial_trace() 获得 rho_encode 与 rho_trashrho_encode = partial_trace(rho_BA, 2 ** N_B, 2 ** N_A, 1)rho_trash = partial_trace(rho_BA, 2 ** N_B, 2 ** N_A, 2)# 解码得到量子态 rho_outrho_CA = kron(self.rho_C, rho_encode)rho_out = matmul(matmul(D, rho_CA), D_dagger)# 通过 rho_trash 计算损失函数zero_Hamiltonian = paddle.to_tensor(np.diag([1,0]).astype('complex128'))loss = 1 - real(trace(matmul(zero_Hamiltonian, rho_trash)))return loss, self.rho_in, rho_out
paddle.seed(SEED)
# 生成网络
net = NET([theta_size])
# 一般来说,我们利用 Adam 优化器来获得相对好的收敛
# 当然你可以改成 SGD 或者是 RMS prop.
opt = paddle.optimizer.Adam(learning_rate=LR, parameters=net.parameters())

6.模型训练

# 优化循环
for itr in range(1, ITR + 1):#  前向传播计算损失函数loss, rho_in, rho_out = net()# 反向传播极小化损失函数loss.backward()opt.minimize(loss)opt.clear_grad()# 计算并打印保真度fid = state_fidelity(rho_in.numpy(), rho_out.numpy())if itr % 5 == 0:print('iter:', itr, 'loss:', '%.4f' % loss, 'fid:', '%.4f' % np.square(fid))
iter: 5 loss: 0.2766 fid: 0.7151
iter: 10 loss: 0.2360 fid: 0.7511
iter: 15 loss: 0.2249 fid: 0.7622
iter: 20 loss: 0.2156 fid: 0.7733
iter: 25 loss: 0.2116 fid: 0.7768
iter: 30 loss: 0.2072 fid: 0.7808
iter: 35 loss: 0.2053 fid: 0.7827
iter: 40 loss: 0.2047 fid: 0.7843
iter: 45 loss: 0.2028 fid: 0.7865
iter: 50 loss: 0.2017 fid: 0.7893
iter: 55 loss: 0.2009 fid: 0.7912
iter: 60 loss: 0.2005 fid: 0.7925
iter: 65 loss: 0.2004 fid: 0.7929
iter: 70 loss: 0.2003 fid: 0.7930
iter: 75 loss: 0.2003 fid: 0.7930
iter: 80 loss: 0.2002 fid: 0.7929
iter: 85 loss: 0.2001 fid: 0.7929
iter: 90 loss: 0.2001 fid: 0.7928
iter: 95 loss: 0.2001 fid: 0.7927
iter: 100 loss: 0.2001 fid: 0.7926

7.模型效果

如果系统 A 的维度为 d A d_A dA,容易证明量子自编码器能实现的压缩重建最大保真度为 ρ i n \rho_{in} ρin 最大的 d A d_A dA 个本征值之和。在本项目里 d A = 2 2 = 4 d_A = 2^2 = 4 dA=22=4,理论最大保真度为:

F max ( ρ i n , ρ o u t ) = ∑ j = 1 d A λ j ( ρ i n ) = 0.3 + 0.2 + 0.2 + 0.1 = 0.8 F_{\text{max}}(\rho_{in}, \rho_{out}) = \sum_{j=1}^{d_A} \lambda_j(\rho_{in})= 0.3 + 0.2 + 0.2 + 0.1 = 0.8 Fmax(ρin,ρout)=j=1dAλj(ρin)=0.3+0.2+0.2+0.1=0.8

通过 100 次迭代,我们训练出的量子自编码器保真度达到 0.7926,和理论最大值0.8非常接近。

使用量桨PaddleQuantum实现有效压缩量子数据的量子自动编码器相关推荐

  1. 走进量子计算的大门——使用量桨PaddleQuantum创建单量子比特门

    使用量桨PaddleQuantum创建单量子比特门 一.量子计算概述 量子计算机为什么能同时存储0和1? 如何测量量子计算的结果 量子计算背后的哲学原理 二.量子计算的数学基础 1.量子比特 2.量子 ...

  2. 每日新闻:达摩院研制量子芯片 进入量子硬件全球巨头竞技场;华为云联手中科院上海生科院,加速生物信息业务向AI、大数据转型...

    关注中国软件网 最新鲜的企业级干货聚集地 洞察 趋势洞察 迈克尔·乔丹:很多不同的东西都在用AI这个概念,而真正的人工智能是尝试让计算机成为像我们这样的人类 加州大学伯克利分校电子工程与计算机系教授迈 ...

  3. mysql 数据文件压缩,压缩MySQL数据文件的妙招

    MySQL数据文件如果过大,能否进行压缩呢?答案是肯定的.下面就教您一个压缩MySQL数据文件的方法,希望对您能有所帮助. MySQL使用一段时间后,MySQL数据文件ibdata会增长得很大(主要是 ...

  4. Nature今年首次撤稿给了微软:研究团队成员自曝删改不利数据,量子计算重大进展是假的...

    贾浩楠 胡子豪 发自 凹非寺 量子位 报道 | 公众号 QbitAI 微软赞助的研究被Nature撤稿了,而且还是2021年"第一撤". 原本被物理学界视为颠覆量子计算技术的成果, ...

  5. 未压缩视频数据计算方式

    未压缩视频数据计算方式 1280 x 720的视频码率为604Mbps.我有一个6秒钟的不压缩视频大小为491MB.视频格式显示为RGB.码率的算法也很简单128072024(颜色位数)*30(帧率) ...

  6. 微软研究团队成员自曝删改不利数据,量子计算重大进展是假的

    本文转载自 量子位,作者 贾浩楠.胡子豪 微软赞助的研究被Nature撤稿了,而且还是2021年"第一撤". 原本被物理学界视为颠覆量子计算技术的成果,不过是论文作者删改数据得来的 ...

  7. pandas使用melt函数将宽表变换为窄表、id_vars参数指定原宽表聚合数据列、value_vars参数指定需要被压缩的数据列(单个、多个)、var_name指定压缩后数据列的名称

    pandas使用melt函数将宽表变换为窄表.id_vars参数指定原宽表聚合数据列.value_vars参数指定需要被压缩的数据列(单个.多个).var_name指定压缩后数据列的名称.value_ ...

  8. 量子科技概念大火,国内现状如何?国盾量子撑起量子通信,华为BAT均入局量子计算...

    晓查 木易 发自 凹非寺  量子位 报道 | 公众号 QbitAI 量子科技,如今快速一文看尽? 最近,量子科技相关知识和行业进展,正在成为关注新热点. 究竟是什么?原理如何?行业内有怎样的代表性技术 ...

  9. 为什么物理诺奖颁给量子信息科学?——量子信息的过去、现在和未来

    导语 10月4日,2022年诺贝尔物理学奖授予 Alain Aspect, John F. Clauser 和 Anton Zeilinger,表彰他们"用纠缠光子实验,验证了量子力学违反贝 ...

最新文章

  1. c语言万年历设计目的,万年历设计报告
  2. 在Spring启动时与mongodb一起摇摆
  3. 单位矩阵的逆| 使用Python的线性代数
  4. linux下qt环境的运行,在Linux下使用QT环境来安装和运行WebKit
  5. Can 总线 收发原理
  6. 理解Attention机制原理及模型
  7. 计算机中函数的括号怎么输,Excel函数中括号的使用
  8. 三相三线与三相四线计算公式
  9. 古体字与简体字对照表_王力_简体字与繁体字对照表
  10. redis雪崩、击穿、穿透
  11. html 文字阴影 一重投影,鼠标移入文字添加阴影 溢出的文字 添加多重颜色
  12. 华硕路由器的虚拟服务器,华硕(ASUS)路由器中继设置_华硕路由器无线中继模式设置教程-192路由网...
  13. vgg16构造模型图(转)
  14. 结构化数据和非结构化数据、半结构化数据的区别-归纳总结整理
  15. 2023年山东大学849软件工程专业考研全套下载
  16. 各大科技公司核心价值观概览
  17. 2019北大计算机夏令营,2019年北京大学化学学院“全国优秀大学生夏令营”第三轮通知...
  18. 如何让快速在CAD图纸中标注文字
  19. Android耳机线控-播放/暂停/上一曲/下一曲
  20. ubuntu16 黑主题_Ubuntu16.04 主题美化

热门文章

  1. 怎么用css打表格框,怎么用css美化表格的边框
  2. 成熟数据模型(CDM/LDM)
  3. android通过usb调试安装apk后 卸载 无法安装release版 魅族note1 note3
  4. 【腾讯云】用Java发送QQ邮件,实现天气预报推送
  5. 达梦数据库DM8(二):新建表空间
  6. c语言中concat函数,SQL注入中用到的Concat函数详解-菜鸟白帽扫盲
  7. java recursion_Java递归(Recursion)
  8. Android AsyncTask的源码探秘
  9. 10大Web漏洞扫描工具
  10. SharePoint 2013 引发类型为“System.ArgumentException”的异常。 参数名: encodedValue