深度学习 之七 【卷积神经网络 CNN】
1.CNN的应用
了解 WaveNet 模型。
- 如果你能训练人工智能机器人唱歌,干嘛还训练它聊天?在 2017 年 4 月,研究人员使用 WaveNet 模型的变体生成了歌曲。原始论文和演示可以在 此处 找到。
了解 文本分类 CNN。
- 你或许想注册作者的 深度学习简讯 !
了解 Facebook 的 创新 CNN 方法(Facebook) ,该方法专门用于解决语言翻译任务,准确率达到了前沿性水平,并且速度是 RNN 模型的 9 倍。
利用 CNN 和强化学习玩 Atari 游戏。你可以下载 此论文附带的代码。
- 如果你想研究一些(深度强化学习)初学者代码,建议你参阅 Andrej Karpathy 的帖子。
利用 CNN 玩 看图说词游戏 !
- 此外,还可以参阅 A.I. Experiments 网站上的所有其他很酷的实现。别忘了 AutoDraw!
详细了解 AlphaGo。
- 阅读 这篇文章,其中提出了一个问题:如果掌控 Go“需要人类直觉”,那么人性受到挑战是什么感觉?
观看这些非常酷的视频,其中的无人机都受到 CNN 的支持。
- 这是初创企业 Intelligent Flying Machines (IFM) (Youtube) 的访谈。
- 户外自主导航通常都要借助 全球定位系统 (GPS) ,但是下面的演示展示的是由 CNN 提供技术支持的 自主无人机(Youtube)。
如果你对无人驾驶汽车使用的 CNN 感兴趣,请参阅:
- 我们的无人驾驶汽车工程师纳米学位课程,我们在此项目中对德国交通标志数据集中的标志进行分类。
- 我们的机器学习工程师纳米学位课程,我们在此项目中对街景门牌号数据集中的门牌号进行分类。
- 这些系列博客,其中详细讲述了如何训练用 Python 编写的 CNN,以便生成能够玩“侠盗猎车手”的无人驾驶 AI。
参阅视频中没有提到的其他应用情形。
- 一些全球最著名的画作被转换成了三维形式,以便视力受损人士也能欣赏。虽然这篇文章没有提到是怎么做到的,我们注意到可以使用 CNN 预测单个图片的深度。
- 参阅这篇关于使用 CNN 确定乳腺癌位置的 研究论文(google research)。
- CNN 被用来 拯救濒危物种!
- 一款叫做 FaceApp 的应用使用 CNN 让你在照片中是微笑状态或改变性别。
2.MLP和CNN的区别
项目:【MNIST MLP练习】
MLP(多层感知器)
- 1.将输入的矩阵转换成向量,然后送到隐藏层,这样会丢失一些二维信息
- 2.对于一些小的图片,比如:28px * 28px,想要达到好的预测效果,参数都超过60万了
如图:4 x 4的矩阵转换成16维向量后,当做输入传递给MLP,这是具有一个隐藏层(四个节点)的MLP,输出层有10个节点,输出时有一个softmax函数,返回一个十维的向量,包含图片描述的0到9的数字的可能概率。
CNN(卷积神经网络)
- 1.接受矩阵作为输入,不需要将矩阵转换成向量
- 2.每一个输入,并不需要与所有的节点相关联
- 3.通过指定过滤器
的数量
和大小
,控制卷积层
的行为
卷积神经网络
特征映射要求,输入的图片格式一样大小的。
局部连接层
- 1.包含更少的权重,
- 2.局部相连,节点仅与上一层中的小部分节点相连
- 3.空间内共享参数
全连接层 Dense(密集层)
- 1.每个节点与前一层中的每个节点相连
卷积窗(过滤器),stride为1的移动动画
Keras的卷积层使用方法
Conv2D(filters, kernel_size, strides, padding, activation='relu', input_shape)
参数
必须传递以下参数:
- filters
- 过滤器数量。
- kernel_size
- 指定(方形)卷积窗口的高和宽的数字。
你可能还需要调整其他可选参数:
- strides
- 卷积 stride。如果不指定任何值,则 strides 设为 1。
- padding
- 选项包括 ‘valid’ 和 ‘same’。如果不指定任何值,则 padding 设为 ‘valid’。
- activation
- 通常为 ‘relu’。如果未指定任何值,则不应用任何激活函数。强烈建议你向网络中的每个卷积层添加一个 ReLU 激活函数。
- input_shape
- 指定输入的高度、宽度和深度(按此顺序)的元组。
注意:可以将 kernel_size
和 strides
表示为数字或元组。
注意:如果卷积层不是网络的第一个层级,请勿包含 input_shape
参数。
更多详细参数使用案例,查阅官方文档
公式:卷积层中的参数数量
卷积层中的参数数量取决于 filters
、kernel_size
和 input_shape
的值。
K
- 卷积层中的过滤器数量F
- 卷积过滤器的高度和宽度D_in
- 上一层级的深度
注意:K = filters
,F = kernel_size
。类似地,D_in
是 input_shape
元祖中的最后一个值。
因为每个过滤器有 F*F*D_in
个权重,卷积层由 K 个过滤器组成,因此卷积层中的权重总数是 K*F*F*D_in
。
因为每个过滤器有 1
个偏差项,卷积层有 K
个偏差。因此,卷积层中的参数数量是 K*F*F*D_in + K
。
公式:卷积层的形状
卷积层的形状取决于 kernel_size
、input_shape
、padding
和 stride
的值。我们定义几个变量:
K
- 卷积层中的过滤器数量F
- 卷积过滤器的高度和宽度H_in
- 上一层级的高度W_in
- 上一层级的宽度
注意:K = filters
、F = kernel_size
,以及S = stride
。类似地,H_in
和 W_in
分别是 input_shape
元祖的第一个和第二个值。
卷积层的深度始终为过滤器
数量 K
。
如果 padding
= ‘same’,那么卷积层的空间维度如下:
- height = ceil(float(
H_in
) / float(S
)) - width = ceil(float(
W_in
) / float(S
))
如果 padding
= ‘valid’,那么卷积层的空间维度如下:
- height = ceil(float(
H_in
- F + 1) / float(S
)) - width = ceil(float(
W_in
- F + 1) / float(S
))
池化层
池化层总是将卷积层作为输入。
卷积层是指特征映射堆栈
,每个过滤器对应一个特征映射,且负责从图片中查找一种规律
过滤器越多,堆栈越大,维度就越高,参数也会更多,这就很可能导致过拟合,因此我们需要降低维度,这就是池化层在卷积神经网络中扮演的角色。
最大池化层 Max Pooling Layer
就是在卷积窗(过滤器)在移动过程中,每次取最大的那个数,这样就一次一次的卷积运算,都会将维度,降低矩阵大小,如下图
每个特征映射的宽和高都减小了,如下图
代码实例:
from keras.models import Sequential
from keras.layers import MaxPooling2Dmodel = Sequential()
model.add(MaxPooling2D(pool_size=2, strides=2, input_shape=(100, 100, 15)))
model.summary()
参数
你必须包含以下参数:
- pool_size
- 指定池化窗口高度和宽度的数字。
你可能还需要调整其他可选参数:
- strides
- 垂直和水平 stride
。如果不指定任何值,则 strides
默认为 pool_size
。
- padding
- 选项包括 'valid'
和 'same'
。如果不指定任何值,则 padding
设为 'valid'
。
注意:可以将 pool_size
和 strides
表示为数字或元组。
此外,建议阅读 官方文档。
举栗子:
假设我要构建一个 CNN
,并且我想通过在卷积层后面添加最大池化层
,降低卷积层的维度。假设卷积层的大小是 (100, 100, 15)
,我希望最大池化层的大小为 (50, 50, 15)
。要实现这一点,我可以在最大池化层中使用 2x2
窗口,stride
设为 2
,代码如下:
MaxPooling2D(pool_size=2, strides=2)
当然了,stride
也可以为 1
。
全局平均池化 Global Average Pooling Layer
全局平均池化,既不指定卷积窗(kernel_size
)大小,也不指定 stride
,这是一种更极端的降低维度的池化类型,过程是:
- 1.它获得了一堆的特征映射
- 2.并计算每个映射的节点均值(均值,就是先对所有的节点值求和,然后除以总节点数)
- 3.这样的话,每个特征映射都缩减成了一个值
最后全局平均池化就将一个三维的数组转变成了一个向量
了解不同类型的池化层,请参阅该 Keras 文档
第一个CNN的架构介绍
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Densemodel = Sequential()
model.add(Conv2D(filters=16, kernel_size=2, padding='same', activation='relu', input_shape=(32, 32, 3)))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(filters=32, kernel_size=2, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(filters=64, kernel_size=2, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Flatten())
model.add(Dense(500, activation='relu'))
model.add(Dense(10, activation='softmax'))
注意事项
- 始终向 CNN 中的
Conv2D
层添加ReLU
激活函数。但是网络的最后层级除外,密集层也应该具有ReLU
激活函数。 - 在构建分类网络时,网络中的最后层级应该是具有
softmax
激活函数的 密集层。最后层级的节点数量
应该等于数据集中的类别总数
。 - 建议参阅 Andrej Karpathy 的 tumblr(来自外网,可能打不开),其中包含了用户提交的损失函数,对应的是本身有问题的模型。损失函数在训练期间应该是减小的,但是这些图表显示的却是非常不同的行为 :)。
【测试小项目】cifar10_mlp.ipynb
和 cifar10_cnn.ipynb
https://github.com/IntelligentPeople/aind2-cnn/tree/master/cifar10-classification
增强图片的训练
为什么要增强图片的训练?这是因为图片数据集中的预测目标对象不可能都是在正中间,有的图片倾斜着,有的图片歪倒着,这就需要我们来生成一些位置不一样的同类图片,加入到训练集中。
- Rotation Invariance 旋转不变性
- Translation Invariance 平移不变性
这就需要用到 ImageDataGenerator
类
from keras.preprocessing.image import ImageDataGenerator# create and configure augmented image generator
datagen_train = ImageDataGenerator(width_shift_range=0.1, # randomly shift images horizontally (10% of total width)height_shift_range=0.1, # randomly shift images vertically (10% of total height)horizontal_flip=True) # randomly flip images horizontally# fit augmented image generator on data
datagen_train.fit(x_train)
训练时,将 fit()
函数换成了 fit_generator()
from keras.callbacks import ModelCheckpoint batch_size = 32
epochs = 100# train the model
checkpointer = ModelCheckpoint(filepath='aug_model.weights.best.hdf5', verbose=1, save_best_only=True)
model.fit_generator(datagen_train.flow(x_train, y_train, batch_size=batch_size),steps_per_epoch=x_train.shape[0] // batch_size,epochs=epochs, verbose=2, callbacks=[checkpointer],validation_data=(x_valid, y_valid),validation_steps=x_valid.shape[0] // batch_size)
在 Keras 中,封装了一些著名的 CNN 预训练模型
- Xception
- VGG16
- VGG19
- ResNet50
- InceptionV3
- InceptionResNetV2
- MobileNet
- DenseNet
- NASNet
可视化CNN
斯坦福大学某节课中提到的可视化:http://cs231n.github.io/understanding-cnn/
可视化CNN的 OpenFrameworks 的 演示
这是另一个 CNN 可视化工具的 演示。如果你想详细了解这些可视化图表是如何制作的,请观看此视频。
这是另一个可与 Keras 和 Tensorflow 中的 CNN 无缝合作的可视化工具。
阅读这篇可视化 CNN 如何看待这个世界的 Keras 博文。在此博文中,你会找到 Deep Dreams 的简单介绍,以及在 Keras 中自己编写 Deep Dreams 的代码。阅读了这篇博文后:
再观看这个利用 Deep Dreams 的 音乐视频(注意 3:15-3:40 部分)!
使用这个网站创建自己的 Deep Dreams(不用编写任何代码!)。
如果你想详细了解 CNN 的解释
这篇文章详细讲解了在现实生活中使用深度学习模型(暂时无法解释)的一些危险性。
这一领域有很多热点研究。这些作者最近朝着正确的方向迈出了一步。
深度可视化工具箱
假如有一个三层的Conv2d的网络模型,那么它发现规律的流程是
- 第一层级将检测图片中的边缘
- 第二层级将检测形状
- 第三个卷积层将检测更高级的特征
著名卷积网络
- AlexNet
TensorFlow 的CNN
卷积层 tf.nn.conv2d()
上述代码用了 tf.nn.conv2d()
函数来计算卷积,weights
作为滤波器,[1, 2, 2, 1]
作为 strides
。TensorFlow 对每一个 input 维度使用一个单独的 stride 参数,[batch
, input_height
, input_width
, input_channels
]。我们通常把 batch
和 input_channels
(strides 序列中的第一个第四个)的 stride
设为 1
。
你可以专注于修改 input_height
和 input_width
, batch
和 input_channels
都设置成 1
。input_height
和 input_width
strides
表示滤波器在input 上移动的步长
。上述例子中,在 input 之后,设置了一个 5x5
,stride
为 2
的滤波器。
# Output depth
k_output = 64# Image Properties
image_width = 10
image_height = 10
color_channels = 3# Convolution filter
filter_size_width = 5
filter_size_height = 5# Input/Image
input = tf.placeholder(tf.float32,shape=[None, image_height, image_width, color_channels])# Weight and bias
weight = tf.Variable(tf.truncated_normal([filter_size_height, filter_size_width, color_channels, k_output]))
bias = tf.Variable(tf.zeros(k_output))conv_layer = tf.nn.conv2d(input, weight, strides=[1, 2, 2, 1], padding='SAME')
conv_layer = tf.nn.bias_add(conv_layer, bias)
conv_layer = tf.nn.relu(conv_layer)
最大池化层tf.nn.max_pool()
ksize
和 strides
参数也被构建为四个元素的列表,每个元素对应 input tensor
的一个维度 ([batch
, height
, width
, channels
]),对 ksize
和 strides
来说,batch
和 channel
通常都设置成 1
。
conv_layer = tf.nn.max_pool(conv_layer,ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1],padding='SAME')
池化层总的来说,目的是:减小输入大小,降低过拟合,相应的参数也减少了很多。
但是,近期,池化层并不是很受青睐,部分原因是:
- 现在的数据集又大又复杂,我们更关心欠拟合问题
- dropout是一种更好的正则化方法
- 池化导致信息丢失,想象最大池化的例子,n个数字当中,我们只保留最大的,把剩余的n-1完全舍弃了。
小练习
最大池化层练习 Max Pooling Layer
假如输入数据是
[[[0, 1, 0.5, 10],[2, 2.5, 1, -8],[4, 0, 5, 6],[15, 1, 2, 3]]]
filter_size=(2, 2), strides=(2, 2), 输出维度: 2x2x1,那么经过最大池化层后的结果是:
[2.5,10,15,6]
计算方式
max(0, 1, 2, 2.5) = 2.5
max(0.5, 10, 1, -8) = 10
max(4, 0, 15, 1) = 15
max(5, 6, 2, 3) = 6
全局平均池化 Global Average Layer
假如输入数据是:
[[[0, 1, 0.5, 10],[2, 2.5, 1, -8],[4, 0, 5, 6],[15, 1, 2, 3]]]
filter_size=(2, 2), strides=(2, 2), 输出维度: 2x2x1,那么经过全局平均池化层后的结果是:
1.375,0.875,5.0,4.0
计算方式是:
mean(0, 1, 2, 2.5) = 1.375
mean(0.5, 10, 1, -8) = 0.875
mean(4, 0, 15, 1) = 5
mean(5, 6, 2, 3) = 4
1x1卷积
- 1.
1x1
卷积会增加参数数量 - 2.它关注的是一个像素,而不是一块图像
- 3.相较于池化,它更高效
Inception 模块
通过1x1的卷积输出给 1x1、3x3、5x5的卷积后,再将他们组合起来输出,看起来有点复杂,但是要比简单的卷积好的多
类似如下图
测试项目 【使用TensorFlow的CNN来训练数据】
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
import math# 1.导入MNIST数据集
mnist = input_data.read_data_sets(".", one_hot=True, reshape=False)# 2.设置一些参数
learning_rate = 0.00001
epochs = 10
batch_size = 128test_valid_size = 256n_classes = 10
dropout = 0.75# weights = [filter_size_height, filter_size_width, color_channels, k_output]
weights = {'wc1': tf.Variable(tf.random_normal([28, 28, 1, 32])),'wc2': tf.Variable(tf.random_normal([14, 14, 32, 64])),'wd1': tf.Variable(tf.random_normal([7*7*64, 1024])),'out': tf.Variable(tf.random_normal([1024, n_classes]))}biases = {'bc1': tf.Variable(tf.random_normal([32])),'bc2': tf.Variable(tf.random_normal([64])),'bd1': tf.Variable(tf.random_normal([1024])),'out': tf.Variable(tf.random_normal([n_classes]))
}# 3.创建卷积函数
def conv2d(x, W, b, strides=1):# strides = [batch, input_height, input_width, input_channels]x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding="SAME")x = tf.nn.bias_add(x, b)return tf.nn.relu(x)# 创建最大池化层函数
def maxpool2d(x, k=2):return tf.nn.max_pool(x, ksize=[1, k, k, 1], strides=[1, k, k, 1], padding="SAME")# 创建卷积网络函数
def conv_net(x, weights, biases, dropout):# Layer 1 - 28*28*1 to 14*14*32conv1 = conv2d(x, weights['wc1'], biases['bc1']) # 28*28*1conv1 = maxpool2d(conv1, k=2) # 14*14*32# Layer 2 - 14*14*32 to 7*7*64conv2 = conv2d(conv1, weights['wc2'], biases['bc2']) # 14*14*32conv2 = maxpool2d(conv2, k=2) # 7*7*64fc1 = tf.reshape(conv2, [-1, weights['wd1'].get_shape().as_list()[0]])fc1 = tf.add(tf.matmul(fc1, weights['wd1']), biases['bd1'])fc1 = tf.nn.relu(fc1)fc1 = tf.nn.dropout(fc1, dropout)out = tf.add(tf.matmul(fc1, weights['out']), biases['out'])return out# inputs = [bach_size, image_height, image_width, color_channels]
x = tf.placeholder(tf.float32, [None, 28, 28, 1])
y = tf.placeholder(tf.float32, [None, n_classes])# 留存率 训练时=0.5,验证和测试时=1.0
keep_prob = tf.placeholder(tf.float32) # 计算输出层的线性激活函数 logit score
logits = conv_net(x, weights, biases, keep_prob)# 创建误差项
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))# 创建优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cost)# 预测是否正确
correct_pred = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1))
# 获得精确度
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))# 4.训练网络
with tf.Session() as session:# 初始化tensorflow的所有变量session.run(tf.global_variables_initializer())# 迭代 epoch 次for epoch in range(epochs):# 计算需要多少个 batchbatches = int(math.ceil(mnist.train.num_examples // batch_size))# 每次 epoch,需要训练分类器 batches 次for batch in range(batches):# 获取下一个批次的训练数据batch_x, batch_y = mnist.train.next_batch(batch_size)# 训练数据session.run(optimizer, feed_dict={x: batch_x, y: batch_y, keep_prob: dropout})# 计算训练误差值loss = session.run(cost, feed_dict={x: batch_x, y: batch_y, keep_prob: 1.})# 计算训练精准度vali_acc = session.run(accuracy, feed_dict={x: mnist.validation.images[:test_valid_size], y: mnist.validation.labels[:test_valid_size], keep_prob: 1.})print("Epoch={:>2} Batch={:>3} Loss={:.4f} Validation Accuracy={:.6f}".format(epoch+1, batch+1, loss, vali_acc))# 最后训练完后,根据测试数据集得出测试精准度test_acc = session.run(accuracy, feed_dict={x: mnist.test.images[:test_valid_size], y: mnist.test.labels[:test_valid_size], keep_prob: 1.})print("Test Accuracy: {}".format(test_acc))
test accuracy是:
Test Accuracy: 0.9609375
【小项目】练习 keras版本的CNN和transfer learning : https://github.com/IntelligentPeople/aind2-cnn
课外阅读
Andrej Karpathy’s CS231n Stanford course on Convolutional Neural Networks.
Michael Nielsen’s free book on Deep Learning.
Goodfellow, Bengio, and Courville’s more advanced free book on Deep Learning.
参考:
https://www.youtube.com/embed/HrYNL_1SV2Y
局部连接性:https://www.youtube.com/embed/z9wiDg0w-Dc
卷积层1:https://www.youtube.com/embed/h5R_JvdUrUI
卷积层2:https://www.youtube.com/embed/RnM1D-XI–8
自己创建过滤器。然后,你可以使用你的摄像头作为卷积层的输入,并可视化对应的激活映射!:http://setosa.io/ev/image-kernels/
network in network:https://arxiv.org/abs/1312.4400
使用CNN竞赛的数据集CIFAR-10参阅: http://blog.kaggle.com/2015/01/02/cifar-10-competition-winners-interviews-with-dr-ben-graham-phil-culliton-zygmunt-zajac/
梯度消失的详细处理方案:http://neuralnetworksanddeeplearning.com/chap5.html
可视化CNN介绍:https://www.youtube.com/embed/mnqS_EhEZVg
深度学习 之七 【卷积神经网络 CNN】相关推荐
- 深度学习~卷积神经网络(CNN)概述
目录 1. 卷积神经网络的形成和演变 1.1 卷积神经网络结构 1.2 卷积神经网络的应用和影响 1.3 卷积神经网络的缺陷和视图 1.3.1 缺陷:可能错分 1.3.2 解决方法:视图 ...
- 深度学习之卷积神经网络CNN
转自:https://blog.csdn.net/cxmscb/article/details/71023576 一.CNN的引入 在人工的全连接神经网络中,每相邻两层之间的每个神经元之间都是有边相连 ...
- 深度学习之卷积神经网络CNN理论与实践详解
六月 北京 | 高性能计算之GPU CUDA培训 6月22-24日三天密集式学习 快速带你入门阅读全文> 正文共1416个字,6张图,预计阅读时间6分钟. 概括 大体上简单的卷积神经网络是下面 ...
- 深度学习之卷积神经网络CNN 常用的几个模型
LeNet5 论文:http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf LeNet-5:是Yann LeCun在1998年设计的用于手写数字识别的卷 ...
- 干货 | 深度学习之卷积神经网络(CNN)的模型结构
微信公众号 关键字全网搜索最新排名 [机器学习算法]:排名第一 [机器学习]:排名第一 [Python]:排名第三 [算法]:排名第四 前言 在前面我们讲述了DNN的模型与前向反向传播算法.而在DNN ...
- 深度学习:卷积神经网络CNN入门
作者:机器之心 链接:https://www.zhihu.com/question/52668301/answer/131573702 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业 ...
- 深度学习笔记-卷积神经网络CNN与循环神经网络RNN有什么区别?
转载 https://blog.csdn.net/weixin_35227692/article/details/79223536 转载于:https://www.cnblogs.com/USTBlx ...
- 【深度学习】卷积神经网络-图片分类案例(pytorch实现)
前言 前文已经介绍过卷积神经网络的基本概念[深度学习]卷积神经网络-CNN简单理论介绍.下面开始动手实践吧.本文任务描述如下: 从公开数据集CIFAR10中创建训练集.测试集数据,使用Pytorch构 ...
- 机器学习——深度学习之卷积神经网络(CNN)——AlexNet卷积神经网络结构
目录 一.AlexNet卷积神经网络结构模型 1.数据库ImageNet 2.AlexNet第一层卷积层 二.AlexNet卷积神经网络的改进 1.非线性变化函数的改变--ReLU 2.最大池化(Ma ...
- 深度学习之卷积神经网络(Convolutional Neural Networks, CNN)(二)
前面我们说了CNN的一般层次结构, 每个层的作用及其参数的优缺点等内容.深度学习之卷积神经网络(Convolutional Neural Networks, CNN)_fenglepeng的博客-CS ...
最新文章
- 谷歌助力,快速实现 Java 应用容器化
- DotNET企业架构应用实践-系统架构与性能-缓存技术与ORM中的缓存查询技术
- 工信部:推动制定出台工业互联网发展战略
- ICA处理脑电资料汇总
- Linux使用dd命令快速生成大文件
- 19、SQL Server 数据修改之Insert into
- springMVC分析-2
- java父类shape_为什么该父类无法调用其子类.__ShapeCircle_public_perimeter_getType_shapej__169IT.COM...
- 《深入浅出DPDK》读书笔记(十三):DPDK虚拟化技术篇(加速包处理的vhost优化方案)
- python与txt文件查找,在Python中搜索TXT文件
- Java实现UDP功能
- 华图教育计算机,计算机vf考试考什么
- apkg格式怎么打开_pdf怎么转换成word?妙招在手,转换不愁!
- 淘宝购物车页面测试用例
- arcsde93安装好了之后,配置连接sde库失败, 提示st_domain_methods报错
- image caption笔记(八):《From Captions to Visual Concepts and Back》
- BLV 3D打印机Klipper配置参考
- deepin Picked up _JAVA_OPTIONS
- 数据可视化、信息可视化与知识可视化
- Debian完全卸载清理并重新安装MySQL服务器
热门文章
- 2022年深圳市生态环境专项资金申请指南
- 天文学+云计算,国家天文台-阿里云战略合作首年成果丰硕
- 四大私募量化策略解析——阿尔法、套利、期货CTA、高频交易
- 情感分析属于计算机科学,一种基于中文语义结构和细分词库结合的情感分析方法...
- 网站建设中如何做好一个网站
- 调用Excel 的Excel.Application失败的问题分析
- 支持webdav的php网盘,将网盘“变”为电脑的硬盘:网盘的WebDAV挂载的妙用,支持开机启动...
- Theos(五):.deb 与 dm.pl
- 轻松转换CAJ文件为PDF格式:免费工具和技巧
- 无法打开文件“libboost_thread-vc120-mt-gd-1_58.lib的解决办法