深度卷积网络:第二课
深度卷积网络:第二课
- 基本概念
- 对数据集合的切分
- 一个训练的过程:
- 学习的种类
- 有监督学习:回归、分类、标签、排序、Seq2Seq
- 无监督学习:聚类、降维、生成模型、GAN、自编码、推荐
- 半监督学习
- 训练中的问题:
- 欠拟合(under-fitting)
- 过拟合(over-fitting)
- 梯度下降的分类:
- 神经网络的正则化
- L1,L2正则化
- Dropout正则化
- 集合
- 多任务学习
- 参数共享
- 标签平滑与噪声标签
- 提前终止
- 数据增强与预处理
- 神经网络的调参:
- 学习速率
- 批大小
- 初始化方法
- 模拟调参
- MNIST问题:
- SoftMax层
- 情况1:分类问题
- 情况2: 标签问题
- 对于损失函数的处理:
- 交叉熵损失函数(Cross-entropy,CE)
- 为什么不再继续使用之前的MSE损失作为损失函数?
- Python实现
- Fashion-MNIST
本文是对《深度卷积网络 原理与实践》的整理
基本概念
对数据集合的切分
- 对数据集不同的切分:
集合名称 | 训练集 | 验证集 | 测试集 |
---|---|---|---|
功能 | 找到参数 | 找到超参数 | 评估性能 |
比例 | 80%(90%) | 10% (5%) | 10%(5%) |
但是在实际运用中,我们的模型在测试集上效果可能还是不理想,可能也会把测试集作为训练集。因此,一些研究中已不再使用验证集。此时有点类似交叉验证(cross-validation)。
不过,由于深度网络的训练往往较慢,所以交叉验证应用的比较少。
一个训练的过程:
以1000个数据,批大小为10。
- 读入1000个数据
- 将数据划分为训练集(900)和测试集(100),固定下来。
- 开始第一个epoch。将训练集的900个数全部打乱,但保持数据和真实标签的一一对应。
- 开始第一个batch,即打乱后的前10个数据送入网络
- 正向传播。将结果与期望值比较计算损失LOSSLOSSLOSS。
- 反向传播。更新网络参数wijw_{ij}wij
- 回到第4步,将第2个batch送入训练。重复直到所有900个训练数据全部跑了一遍
- 将测试集送入网络,正向传播。将结果与期望值比较,计算损失。
- 根据模型最后在训练集上的表现,做一些调整,如
调整学习率
,停止训练
,停止训练并修改超参数
。 - 开始第二个epoch,将训练集的900个数据再次打乱。重复步骤3
学习的种类
有监督学习:回归、分类、标签、排序、Seq2Seq
- 回归:从输入X给出一个数字Y。
- 例子:从人物照片预测人的年龄。从股票走势预测明天的涨跌幅。
- 一般Y是连续的。
- 分类:从输入X给出它属于哪一个类别,例如:
- 例子:人脸识别,手写数字识别,听歌识曲、AlphaGo的策略网络
- 一般Y是离散的。因而损失函数一般为交叉熵损失(cross-entropy)
- 一般给出的是属于不同类别的概率,不同类别相加的概率和为1。因而会用到后文提到的SoftMax层。
- 与回归的区别:不同于回归的一点是,如果两个模型一个预测一个35岁的人的年龄为18岁,另一个预测的为37岁,我们可以根据差值判断两个模型的优劣。然而,如果两个模型在预测手写字母A的时候,一个给出了B,一个给出了C,则无法判断两个模型的优劣。(有些时候这种判断依据值得商榷。)
- 标签(tagging)
- 它与分类的区别在于一个物体可以有多个不同的标签。因而每一个类别概率和可以大于1。
- 排序(Ranking)
- 它与回归的区别在于,它先回归到分数,然后按照分数的顺序给出排序结果。排序不关注具体的分数,只关注最终的排序结果。
- 序列变换(Seq2Seq): 将一段序列转化为另一段序列。
- 例子:翻译、语音识别、聊天机器人。
- 一般使用RNN(循环神经网络),如其中的LSTM(长短期记忆模型)
无监督学习:聚类、降维、生成模型、GAN、自编码、推荐
- 聚类(clustering):将数据集的样本自动划分为几簇(cluster),每簇内的样本有类似之处。
- 降维(dimensionality reduction):将数据投射到地位空间,如自然语言处理中的word2Vec方法。
- 生成模型(generative model):
- 自编码(auto-encoding)
- 生成对抗网络(GAN):只需输入大量无标签的图像,模型就能自动生成类似的图像。
- 推荐(recommendation):目前常见的实现方法:
- 协同过滤:如果计算出用户A和用户B的风格相似,则向用户A推荐用户B喜欢的东西
- 关联规则:如果计算出购买了X的用户往往会购买Y,那么可向购买了X的用户推荐Y
半监督学习
先人工标记少量标签,然后从少量标签训练网络。再人工筛选和修改其中的标签,重复这个过程。因为机器的准确率会逐步提升,所以需要人工修改标签的数据就会变少。
训练中的问题:
欠拟合(under-fitting)
- 出现原因:
- 网络容量不足,可以增加网络的广度和深度;
- 网络有可能陷入了局部的极值或者网络的拟合速度不够。这可以通过
调整学习率
、选取合适的初始化方法
、选取和是的网络架构
等方法解决。 - 数据本身噪声过大
- 非凸问题,模型容易陷入局部极小值。但是因为我们都是小批量更新数据,而每个数据里都会引入一定的噪声,所以网络并不容易陷入局部极值点。实际问题中比较常见的问题是鞍点(解决方法见梯度下降)。
过拟合(over-fitting)
- 出现原因:数据中包含噪声点
- 解决办法:
- 在网络中引入正则化(详见神经网络的正则化) 如
L1,L2正则化
,Dropout正则化
、集合
、多任务学习
、参数共享
、标签平滑(Label Smoothing)
、噪声标签(Noise Label)
- 检查数据是否覆盖了全部的类别,例如训练数据里苹果都是红色的,容易导致最后的模型无法识别绿色的苹果。
- 数据增强
- 在网络中引入正则化(详见神经网络的正则化) 如
在训练数据上的性能 | 在新数据上的性能 | |
---|---|---|
最佳情况:泛化能力高 | 好 | 好 |
过拟合 | 好 | 差 |
欠拟合 | 差 | 差 |
一个比较自然的问题:有没有可能在训练数据上性能不好,反而在新数据上的性能变好了?
有可能!如果在训练的时候采用了数据增强、Dropout、PReLU等方法。但在正常情况下不太容易发生。
梯度下降的分类:
具体的动图演示:动图演示
- momentum
- Adagrad
- Adam
神经网络的正则化
L1,L2正则化
因为过拟合产生的一个原因在于神经元数量可能过多,因此需要减少神经元之间的连接。一个做法就是用正则化,通过将权重w=0w=0w=0来达到减少连接。
- L2正则化:LOSSL2=LOSS+λ∑ww2LOSS_{L2}=LOSS+\lambda \sum_{w} w^2LOSSL2=LOSS+λ∑ww2
- 此时损失函数为LOSSL2=LOSS+λ∑ww2LOSS_{L2}=LOSS+\lambda \sum_{w} w^2LOSSL2=LOSS+λ∑ww2,加上后面这项的目的是让网络试图两所有权重w都靠近0。
- λ\lambdaλ越大,越希望w为0。因为如果λ=0\lambda=0λ=0,则跟之前的损失函数一致,即没有受到任何的正则化惩罚。一般来说λ=0.0001\lambda=0.0001λ=0.0001
- 此时权重更新公式为:winew=wi−∂LOSS∂wi−η⋅(2λwi)=wi⋅(1−2ηλ)−η⋅∂LOSS∂wiw_i^{new}=w_i- \frac{\partial LOSS}{\partial w_i}-\eta \cdot (2\lambda w_{i})=w_i \cdot (1- 2 \eta \lambda) - \eta \cdot \frac{\partial LOSS}{\partial w_i}winew=wi−∂wi∂LOSS−η⋅(2λwi)=wi⋅(1−2ηλ)−η⋅∂wi∂LOSS即,在wiw_iwi前面多了一个衰减项(1−2ηλ)(1- 2 \eta \lambda)(1−2ηλ)
- L1正则化:LOSSL1=LOSS+λ∑w∣w∣LOSS_{L1}=LOSS+\lambda \sum_{w} |w|LOSSL1=LOSS+λ∑w∣w∣
Dropout正则化
- 思路依旧是减少网络中神经元的连接。通过减少每次更新权重的神经元的数量来使得每个神经元都拥有“独当一面”的能力,而不是袖手旁观。
- 来自于2012年的深度神经网络AlexNet,启发了后来的残差神经网络中的随机深度和ShakeShake正则化。
- 基本步骤是:
- 每次训练时,随机删除50%的隐神经元,即更新权重是不更新它们的权重。
- 更新完权重后, 再随机删除50%的隐神经元再训练、更新权重。
集合
通过训练不同架构的神经网络,然后把这些网络饿的输出做平均。【感觉有点类似于机器学习里面的Bagging】
多任务学习
让网络同时完成多个相关的任务,即在损失函数里面反映出这多个方面的损失。
参数共享
- 多任务学习,可以认为是将多个实现不同的网络共享参数。
- 卷积网络也可以看作是在不同神经元之间共享参数,因为它会将同一个卷积核施加于图像的各个区域上。
- BN层也有一定的正则化能力,所以在使用了BN层的深度卷积网络中,不一定再需要额外的正则化。
标签平滑与噪声标签
- 标签平滑:如概率超过95%就把它归为那一类。
- 噪声标签:有一定概率将标签改变。
- 与之相关的正则化方法为mixup,即可以创造虚拟训练样本,用于增强数据集。
如通过(xi,yi)(x_i,y_i)(xi,yi)和(xj,yj)(x_j,y_j)(xj,yj)构造新的数据(λxi+(1−λ)xj,λyi+(1−λ)yj)(\lambda x_i +(1-\lambda) x_j, \lambda y_i +(1-\lambda) y_j)(λxi+(1−λ)xj,λyi+(1−λ)yj)其中yi,yjy_i,y_jyi,yj是标签。
提前终止
在训练集发生过拟合之前就停止训练。
数据增强与预处理
- 数据增强: 目的是提高数据的丰富性,以图像识别为例,可以通过移动、旋转、放大等手段。但是变化幅度不能太大,否则可能会导致网络的欠拟合。Github上也有很多数据增强的库:
- https://github.com/mdbloice/Augmentor
- https://github.com/aleju/imgaug
- 数据预处理:如,图像文件的原始像素往往位于[0,255]之间,如果直接将其输入网络,很容易造成不稳定。我们可以将其初始化到[0,1]或者 [-1,1]或者均值为0,标准差为1。
- 白化(whitening)
- 直方图均衡(histogram equalization)
神经网络的调参:
学习速率
- 如果学习速率太大容易震荡,导致损失函数不再下降。
- 一般做法:最初X个Epoch采用a的学习速率,然后每过Y个Epoch将学习速率减为原来的b分之1。
- ⚠️ 学习速率也和批大小有关。如果将批大小设为原来的N倍,那么适合将学习速率设置为原来的Nα,α∈[0.5,1]N^\alpha, \alpha \in [0.5,1]Nα,α∈[0.5,1]
批大小
- 批大小为N的含义为,每次随机选取N个样本,将他们对应的梯度取平均,用于这次的权重更新。
- 一般来说批大小在16到256之间,但是Facebook论文认为通过设置合理的学习率,在批大小很大时,也能取得较好的性能,从而可以使用8192的批大小,显著缩短训练时间。这里的思想是如果批大小变成原来的N倍,则学习速率也取原来的N倍,但是是经过X个Epoch之后慢慢达到的。之后跟上面一样随着损失函数降低,学习速率逐渐降低。
- Facebook后续研究表明,我们也可以通过逐层调节学习速率,进一步提高批大小。
批大小 大 | 批大小 小 | |
---|---|---|
优点 | 训练速度快 | 训练速度慢 |
缺点 | 占用显存大;SGD中的梯度会更加准确,但网络容易陷入鞍点和极值点的泥潭 | 占用显存小;尽管梯度的随机性比较大,但是网络也因此更有可能跳出鞍点和极值点 |
初始化方法
- ⚠️ 为了神经元的多样性,我们不能一开始直接将所有参数初始化为0。一般我们采用正态分布的随机数,但是偏置项可以全部设置为0。
- 关于正态分布的标准差,有各种研究:
- Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification
- All you need is a good init
- The Shattered Gradients Problem: If resnets are the answer, then what is the question?
- 我们可以通过预训练+精调的方式,尽量接近在“初始化就一步到位”。
模拟调参
http://playground.tensorflow.org/
- 我们注意到,使用较多的数据可以避免过拟合(如用90%的数据用于训练)
- 通过更深的网路,我们可以自动发现和构造出许多特征,因此无需人工选择大量特征作为网络输入。
MNIST问题:
- 数据来源:http://yann.lecun.com/exdb/mnist/
对于输出的处理:
SoftMax层
- 目的:输出每个类别的概率
情况1:分类问题
- 如手写数字的分类问题,即满足两个特点:
- 每一个分类的概率都应该在0%到100%
- 由于每张图像只能属于一个分类,因此所有分类的概率之和应等于100%
- 因此,我们可以在最后一层使用SoftMax作为非线性激活函数。若上一层的输出为ziz_izi,则经过SoftMax后的输出为{qi=ezi∑ieziq_i=\frac{e^{z_i}}{\sum_{i}e^{z_i}}qi=∑ieziezi}。
情况2: 标签问题
- 每一个分类的概率都应该在0%到100%
- 总概率可以超过1
- 因此,我们可以用Sigmoid函数将ziz_izi映射到0到1的区间上。
对于损失函数的处理:
交叉熵损失函数(Cross-entropy,CE)
之所以选择交叉熵的损失函数是为了防止梯度消失。
若期望概率分布为{pip_ipi},网络的期望输出为{qiq_iqi},则网络的交叉熵损失为:LOSS=−∑ipi⋅log(qi)LOSS=-\sum_{i}p_i \cdot log(q_i)LOSS=−i∑pi⋅log(qi)
- 一般来说qiq_iqi为最后一层的输出通过sigmoid函数转化成的[0,1]中间的数字。
- 例子:在AlphaGo价值网络中,我们希望输出1个胜率。此时损失为
LOSS=−p⋅log(q)−(1−p)⋅log(1−q)LOSS = -p\cdot log(q)-(1-p)\cdot log(1-q)LOSS=−p⋅log(q)−(1−p)⋅log(1−q)
其中p为网络预测胜率q的概率。
如果最后一步输入的概率q是通过sigmoid函数输出的,即q=σ(z)q=\sigma(z)q=σ(z),则
∂LOSS∂q=∂∂q(−p⋅log(q)−(1−p)⋅log(1−q))=−pq+1−p1−q\frac{\partial LOSS}{\partial q}=\frac{\partial }{\partial q}(-p\cdot log(q)-(1-p)\cdot log(1-q))=\frac{-p}{q}+\frac{1-p}{1-q}∂q∂LOSS=∂q∂(−p⋅log(q)−(1−p)⋅log(1−q))=q−p+1−q1−p
∂q∂z=σ′(z)=σ(z)(1−σ(z))=q(1−q)\frac{\partial q}{\partial z}=\sigma'(z)=\sigma(z)(1-\sigma(z))=q(1-q)∂z∂q=σ′(z)=σ(z)(1−σ(z))=q(1−q)
所以
∂LOSS∂z=∂LOSS∂q⋅∂q∂z=q−p\frac{\partial LOSS}{\partial z}=\frac{\partial LOSS}{\partial q}\cdot\frac{\partial q}{\partial z}=q-p∂z∂LOSS=∂q∂LOSS⋅∂z∂q=q−p- 注意到这里只要q≠pq \neq pq=p就一定有梯度,不存在梯度消失的情况。
- Rq:它其实与统计学中Kullback-Leibler散度有关。
- ⚠️ 对于SoftMax与交叉熵损失的情况,也可以利用∑ipi=1\sum_ip_i=1∑ipi=1计算出:
∂LOSS∂zi=qi−pi\frac{\partial LOSS}{\partial z_i}=q_i - p_i∂zi∂LOSS=qi−pi
为什么不再继续使用之前的MSE损失作为损失函数?
MSE损失:LOSSMSE=(q−p)2LOSS_{MSE} = (q-p)^2LOSSMSE=(q−p)2
则∂LOSSMSE∂z=2⋅(q−p)⋅q⋅(1−q)\frac{\partial LOSS_{MSE}}{\partial z} = 2\cdot (q-p)\cdot q \cdot (1-q)∂z∂LOSSMSE=2⋅(q−p)⋅q⋅(1−q)
此时当q非常靠近0或1时就会存在梯度消失的现象。
Python实现
- 几个要点:
- MXNet中图像数组的格式是[样本,通道,宽,高]。这里的通道对于灰度图像为1。
- 数据的归一化很重要,这有利于提高梯度的稳定性。在这个例子中,因为图像的数值在0到255,所以直接除以255,完成归一化。
- 正轨: 1/4
import numpy as np
import os
import gzip #为了解压文件
import struct
import logging
import mxnet as mx
import matplotlib.pyplot as pltlogging.getLogger().setLevel(logging.DEBUG)
- 正轨: 2/4
# 辅助读入训练数据
def read_data(label_url,image_url):with gzip.open(label_url) as flbl: #打开标签文件magic,num = struct.unpack(">II", flbl.read(8)) #读入标签文件头label = np.fromstring(flbl.read(),dtype = np.int8) #读入标签内容with gzip.open(image_url,'rb') as fimg: #打开图像文件magic,num,rows,cols = struct.unpack(">IIII",fimg.read(16)) # 读入图像文件头,这里图像是28*28所以rows和cols都会是28image = np.fromstring(fimg.read(), dtype=np.uint8) #读入图像内容image = image.reshape(len(label),1,rows,cols) # 设置为正确的数组格式imgae = image.astype(np.float32)/255.0 # 归一化到0到1的区间return (label,image)
# 读入数据
(train_lbl,train_img) = read_data('train-labels-idx1-ubyte.gz','train-images-idx3-ubyte.gz')
(val_lbl,val_img) = read_data('t10k-labels-idx1-ubyte.gz','t10k-images-idx3-ubyte.gz')
- 观察以下我们导入的数据(题外话)
# 显示一些数字样例
for i in range(10):plt.subplot(1,10,i+1) #画成1*10的图plt.imshow(train_img[i].reshape(28,28),cmap='Greys_r') #每一个train_img[i]对应的是(1, 28, 28),reshape之后成为(28,28)plt.axis('off')
plt.show()
print(f'Train labels: {train_lbl[0:10]}')
- 正轨: 3/4
# 定义迭代器和超参数
batch_size = 32train_iter = mx.io.NDArrayIter(train_img,train_lbl,batch_size,shuffle=True)
val_iter = mx.io.NDArrayIter(val_img,val_lbl,batch_size)# 定义网络结构
data = mx.symbol.Variable('data')flatten = mx.sym.Flatten(data = data, name="flatten") #将(1,28,28)的图像拉平成为784个数据点# 第1层神经网络,128个神经元,使用ReLU激活
fc1 = mx.sym.FullyConnected(data = flatten, num_hidden = 128, name = "fc1")
act1 = mx.sym.Activation(data = fc1, act_type="relu", name = "act1")# 第2层神经网络,64个神经元,使用ReLU激活
fc2 = mx.sym.FullyConnected(data = act1, num_hidden = 64, name="fc2")
act2 = mx.sym.Activation(data = fc2, act_type="relu", name = "act2")# 输出神经元,因为0-9一共10个数字,十类。所以有10个神经元
fc3 = mx.sym.FullyConnected(data = act2, num_hidden=10, name="fc3")# SoftMax层,将上一层输出的10个数字通过e^zi的加权的形式输出
net = mx.sym.SoftmaxOutput(data = fc3, name="softmax")
- 观察网络结构和参数(题外话)
# 研究网络的参数
#这里写4个数字是因为MXNet中图像数组的格式是[样本,通道,宽,高],这里我们是一张28*28的灰度图。
mx.viz.print_summary(symbol=net,shape={"data":(batch_size,1,28,28)})
# 可视化网络
mx.viz.plot_network(symbol=net,shape={"data":(batch_size,1,28,28)})
- 正轨: 4/4
# 正式开始训练
# 这里可以用cpu,或者gpu两种方法进行训练。
module = mx.mod.Module(symbol=net,context=mx.cpu(0))
module.fit(train_iter, # 训练数据的迭代器eval_data = val_iter, # 因为这里只训练,并未使用测试数据optimizer='sgd', #采用随机梯度下降的方式优化optimizer_params = {'learning_rate': 0.2, 'lr_scheduler': mx.lr_scheduler.FactorScheduler(step=60000/batch_size,factor=0.9)}, #每过60000个样本学习率等于之前的0.9倍num_epoch = 20, #训练的epoch数batch_end_callback = mx.callback.Speedometer(batch_size, 60000/batch_size) #这里依旧一个个训练
)
Fashion-MNIST
GAN的发明人Ian Goodfellow号召大家尽量少用MNIST,而改用Fashion-MNIST
深度卷积网络:第二课相关推荐
- 深度学习笔记 第四门课 卷积神经网络 第二周 深度卷积网络:实例探究
本文是吴恩达老师的深度学习课程[1]笔记部分. 作者:黄海广[2] 主要编写人员:黄海广.林兴木(第四所有底稿,第五课第一二周,第三周前三节).祝彦森:(第三课所有底稿).贺志尧(第五课第三周底稿). ...
- 吴恩达深度学习课程之第四门课 卷积神经网络 第二周 深度卷积网络
本文参考黄海广主编针对吴恩达深度学习课程DeepLearning.ai <深度学习课程 笔记 (V5.1 )> 第二周 深度卷积网络 2.1 为什么要进行实例探究?(Why look at ...
- 吴恩达deeplearning.ai系列课程笔记+编程作业(11)第四课 卷积神经网络-第二周 深度卷积网络:实例探究(Deep convolutional models: case studies)
第四门课 卷积神经网络(Convolutional Neural Networks) 第二周 深度卷积网络:实例探究(Deep convolutional models: case studies) ...
- 第二周 深度卷积网络:实例探究(Deep convolutional models: case studies)
第二周 深度卷积网络:实例探究(Deep convolutional models: case studies) 文章目录 第二周 深度卷积网络:实例探究(Deep convolutional mod ...
- 经典论文复现 | 基于深度卷积网络的图像超分辨率算法
过去几年发表于各大 AI 顶会论文提出的 400 多种算法中,公开算法代码的仅占 6%,其中三分之一的论文作者分享了测试数据,约 54% 的分享包含"伪代码".这是今年 AAAI ...
- 4.4)深度卷积网络:人脸识别和神经风格转换
目录 1)What is face recognition? 2)One-shot learning 3)Siamese network 4)Triplet Loss(重点) 5)Face Verif ...
- 深度学习笔记(46) 深度卷积网络学习
深度学习笔记(46) 深度卷积网络学习 1. 学习内容 2. 第一层 3. 第二层 4. 第三层 5. 第四层 6. 第五层 1. 学习内容 深度卷积网络到底在学什么? 来看一个例子,假如训练了一个卷 ...
- (四十七:2021.08.25)《ENCASE:使用专业特征和深度卷积网络相结合来对ECG进行分类》
<ENCASE:使用专业特征和深度卷积网络相结合来对ECG进行分类(ENCASE: an ENsemble ClASsifiEr for ECG Classification Using Exp ...
- 【转载】基于深度卷积网络方法的高光谱图像分类
图片来源网络 本期为大家推介的是北京理工大学李伟教授关于高光谱图像分类的深度卷积网络方法的报告-Deep Convolutional Neural Network for Hyperspectral ...
最新文章
- 【自考】信息系统开发与管理(二)——章节详读
- [NOTE] WebGoat v8.2.2学习笔记
- 学生信息的电子化管理考试题
- C# 垃圾回收器高效工作
- js形参(parameter)和实参(argument)
- 矩阵键盘数 码管显示多位数 c语言,4×4矩阵键盘数码管显示按键值程序
- golang中如何使用http,socket5代理
- win8系统电脑中病毒了怎么办,如何解决win8电脑中毒
- 简单java程序_简单的Java程序
- 2.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:...
- ajax编辑教程,今天手动编写了一个简易的 ajax 发起器(JavaScript)
- KEPServerEX 6 之 EX 6.11.718.0 发布说明
- Matlab指数函数e最小二乘法,最小二乘法拟合指数函数(Matlab编程),着急,
- [恒指赵鑫] 为什么恒指是2019年最火最受欢迎的交易品种?
- android 双向加密算法,Android编程加密算法小结(AES、Base64、RAS加密算法)
- 全球及中国机器视觉光源行业市场调查及投资可行性研究报告2022-2028年
- 手机QQ2010(BlackBerry)Beta1公测
- 电大2020春计算机形考作业,成教作业网提供国开电大2020年 建筑构造 形考任务1-4答案...
- pytorch模型(.pt)转onnx模型(.onnx)的方法详解(1)
- 过亿云资源运维管控难?华为云CloudMap带你喝着咖啡做运维
热门文章
- 计算机中术语中bit的含义是,bit的用法总结大全
- hackinglab-脚本关5——逗比验证码第一期
- [乡土民间故事_徐苟三传奇]第四二回_见洋广争啃西瓜皮
- myeclipse编译无效,debug下一步执行不正确,修改的代码没有起作用
- 什么是高防服务器,高防服务器的原理
- Compose Multiplatform 实战:联机五子棋
- 05-Python—列表、元祖、字典、集合操作大全:建议收藏
- wps2016向程序发送命令_Excel:向程序发送命令时出现问题
- 怎么在excel中导入ChemDraw结构图
- 脸萌~基于SVG绘制