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_sizestrides 表示为数字或元组。
注意:如果卷积层不是网络的第一个层级,请勿包含 input_shape 参数。

更多详细参数使用案例,查阅官方文档

公式:卷积层中的参数数量

卷积层中的参数数量取决于 filterskernel_sizeinput_shape 的值。

  • K - 卷积层中的过滤器数量
  • F - 卷积过滤器的高度和宽度
  • D_in - 上一层级的深度

注意:K = filtersF = kernel_size。类似地,D_ininput_shape 元祖中的最后一个值。
因为每个过滤器有 F*F*D_in 个权重,卷积层由 K 个过滤器组成,因此卷积层中的权重总数是 K*F*F*D_in
因为每个过滤器有 1 个偏差项,卷积层有 K 个偏差。因此,卷积层中的参数数量是 K*F*F*D_in + K

公式:卷积层的形状

卷积层的形状取决于 kernel_sizeinput_shapepaddingstride 的值。我们定义几个变量:

  • K - 卷积层中的过滤器数量
  • F - 卷积过滤器的高度和宽度
  • H_in - 上一层级的高度
  • W_in - 上一层级的宽度

注意:K = filtersF = kernel_size,以及S = stride。类似地,H_inW_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_sizestrides 表示为数字或元组。

此外,建议阅读 官方文档。

举栗子:
假设我要构建一个 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.ipynbcifar10_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]。我们通常把 batchinput_channels (strides 序列中的第一个第四个)的 stride 设为 1

你可以专注于修改 input_heightinput_widthbatchinput_channels 都设置成 1input_heightinput_width strides 表示滤波器在input 上移动的步长。上述例子中,在 input 之后,设置了一个 5x5stride2 的滤波器。

# 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()

ksizestrides 参数也被构建为四个元素的列表,每个元素对应 input tensor 的一个维度 ([batch, height, width, channels]),对 ksizestrides 来说,batchchannel 通常都设置成 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】相关推荐

  1. 深度学习~卷积神经网络(CNN)概述

    目录​​​​​​​ 1. 卷积神经网络的形成和演变 1.1 卷积神经网络结构 1.2 卷积神经网络的应用和影响 1.3 卷积神经网络的缺陷和视图 1.3.1 缺陷:可能错分 1.3.2 解决方法:视图 ...

  2. 深度学习之卷积神经网络CNN

    转自:https://blog.csdn.net/cxmscb/article/details/71023576 一.CNN的引入 在人工的全连接神经网络中,每相邻两层之间的每个神经元之间都是有边相连 ...

  3. 深度学习之卷积神经网络CNN理论与实践详解

    六月 北京 | 高性能计算之GPU CUDA培训 6月22-24日三天密集式学习  快速带你入门阅读全文> 正文共1416个字,6张图,预计阅读时间6分钟. 概括 大体上简单的卷积神经网络是下面 ...

  4. 深度学习之卷积神经网络CNN 常用的几个模型

    LeNet5 论文:http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf LeNet-5:是Yann LeCun在1998年设计的用于手写数字识别的卷 ...

  5. 干货 | 深度学习之卷积神经网络(CNN)的模型结构

    微信公众号 关键字全网搜索最新排名 [机器学习算法]:排名第一 [机器学习]:排名第一 [Python]:排名第三 [算法]:排名第四 前言 在前面我们讲述了DNN的模型与前向反向传播算法.而在DNN ...

  6. 深度学习:卷积神经网络CNN入门

    作者:机器之心 链接:https://www.zhihu.com/question/52668301/answer/131573702 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  7. 深度学习笔记-卷积神经网络CNN与循环神经网络RNN有什么区别?

    转载 https://blog.csdn.net/weixin_35227692/article/details/79223536 转载于:https://www.cnblogs.com/USTBlx ...

  8. 【深度学习】卷积神经网络-图片分类案例(pytorch实现)

    前言 前文已经介绍过卷积神经网络的基本概念[深度学习]卷积神经网络-CNN简单理论介绍.下面开始动手实践吧.本文任务描述如下: 从公开数据集CIFAR10中创建训练集.测试集数据,使用Pytorch构 ...

  9. 机器学习——深度学习之卷积神经网络(CNN)——AlexNet卷积神经网络结构

    目录 一.AlexNet卷积神经网络结构模型 1.数据库ImageNet 2.AlexNet第一层卷积层 二.AlexNet卷积神经网络的改进 1.非线性变化函数的改变--ReLU 2.最大池化(Ma ...

  10. 深度学习之卷积神经网络(Convolutional Neural Networks, CNN)(二)

    前面我们说了CNN的一般层次结构, 每个层的作用及其参数的优缺点等内容.深度学习之卷积神经网络(Convolutional Neural Networks, CNN)_fenglepeng的博客-CS ...

最新文章

  1. 谷歌助力,快速实现 Java 应用容器化
  2. DotNET企业架构应用实践-系统架构与性能-缓存技术与ORM中的缓存查询技术
  3. 工信部:推动制定出台工业互联网发展战略
  4. ICA处理脑电资料汇总
  5. Linux使用dd命令快速生成大文件
  6. 19、SQL Server 数据修改之Insert into
  7. springMVC分析-2
  8. java父类shape_为什么该父类无法调用其子类.__ShapeCircle_public_perimeter_getType_shapej__169IT.COM...
  9. 《深入浅出DPDK》读书笔记(十三):DPDK虚拟化技术篇(加速包处理的vhost优化方案)
  10. python与txt文件查找,在Python中搜索TXT文件
  11. Java实现UDP功能
  12. 华图教育计算机,计算机vf考试考什么
  13. apkg格式怎么打开_pdf怎么转换成word?妙招在手,转换不愁!
  14. 淘宝购物车页面测试用例
  15. arcsde93安装好了之后,配置连接sde库失败, 提示st_domain_methods报错
  16. image caption笔记(八):《From Captions to Visual Concepts and Back》
  17. BLV 3D打印机Klipper配置参考
  18. deepin Picked up _JAVA_OPTIONS
  19. 数据可视化、信息可视化与知识可视化
  20. Debian完全卸载清理并重新安装MySQL服务器

热门文章

  1. 2022年深圳市生态环境专项资金申请指南
  2. 天文学+云计算,国家天文台-阿里云战略合作首年成果丰硕
  3. 四大私募量化策略解析——阿尔法、套利、期货CTA、高频交易
  4. 情感分析属于计算机科学,一种基于中文语义结构和细分词库结合的情感分析方法...
  5. 网站建设中如何做好一个网站
  6. 调用Excel 的Excel.Application失败的问题分析
  7. 支持webdav的php网盘,将网盘“变”为电脑的硬盘:网盘的WebDAV挂载的妙用,支持开机启动...
  8. Theos(五):.deb 与 dm.pl
  9. 轻松转换CAJ文件为PDF格式:免费工具和技巧
  10. 无法打开文件“libboost_thread-vc120-mt-gd-1_58.lib的解决办法