本文写于学习极客时间专栏【数据分析实战45讲】后
数据挖掘通常是从现有的数据中提取规律模式以及使用算法模型,核心目的是找到变量之间的关系。更强调从数据中挖掘价值。
机器学习是通过训练数据和算法模型让机器具有一定的智能,一般通过已有的数据学习知识并通过各种算法模型形成一定的处理能力,如分类、聚类、预测、推荐能力等。
深度学习属于机器学习的一种,只是它是通过神经网络实现的。神经网络就像是机器的大脑,通过多次训练后可以逐步具备某种能力。
深度学习与传统的机器学习最大的区别是:深度学习会自己找到数据的特征规律,传统的机器学习需要采用什么样的模型算法。
神经网络就像是机器的大脑。只需要输入数据和输出数据就可以自我训练。
节点:神经元也称之为节点,组成神经网络
输入层:负责接收信号,分发到隐藏层。
输出层:负责输出计算结果,一般来说输出层节点数等于要分类的个数。
隐藏层:除输入层和输出层外的神经网络都属于隐藏层,计算前一层节点传输出来的数据,把数据抽象到另一个维度的空间中,对数据的特征进行降维和计算。
前向传播:数据从输入层传递到输出层的过程叫前向传播。
反向传播:当前向传播传递到输出层得到分类结果后,与实际值对比,得到误差。反向传播也叫做误差反向传播。通过代价参数修正网络中的参数,这样更容易收敛。
常见的神经网络:
FNN<Fully-connected Neural Network>全连接神经网络,每一层的神经元与上一层的所有神经元都是连接的。
CNN 卷积神经网络,广泛应用于图像处理中,包含卷积层、池化层和全连接层。
RNN 循环神经网络,神经元的输出可以在下一刻作用到自身,可以看作是在时间上传递的神经网络,应用于语音识别、自然语言处理等于上下文相关的场景。
深度学习三大应用领域:图像识别、语音识别、自然语言处理。
卷积操作的原理:
1、将卷积核反转180度
2、将卷积核的第一个元素,对准矩阵左上角的第一个元素,对应元素相乘,然后再相加
3、每个元素都按照第二步的计算结果,可以得到最终的矩阵结果
#卷积
import pylab
import numpy as np
from scipy import signal
#设置原图像
img = np.array([[10, 10, 10, 10, 10],
[10, 5, 5, 5, 10],
[10, 5, 5, 5, 10],
[10, 5, 5, 5, 10],
[10, 10, 10, 10, 10]])
#设置卷积核
fil=np.array([[-1, -1, 0],
[-1, 0, 1],
[0, 1, 1]])
#对原图像进行卷积操作
res = signal.convolve2d(img, fil, mode="valid")
#输出卷积后的结果
print(res)
#结果为:
# [[ 15 10 0]
# [ 10 0 -10]
# [ 0 -10 -15]]
import matplotlib.pyplot as plt
import pylab
#pip install opencv-python
import cv2
import numpy as np
from scipy import signal
#读取灰度图像
img = cv2.imread("1.png", 0)
#显示灰度图像
plt.imshow(img, cmap="gray")
pylab.show()
#设置卷积核
#每个卷积核都是一种滤波器,把图像中符合条件的部分筛选出来,相当于某种特征提取
fil = np.array([[-1, -1, 0],
[-1, 0, 1],
[0, 1, 1]])
#卷积操作
res = signal.convolve2d(img, fil, mode="valid")
print(res)
#显示卷积后的图片
plt.imshow(res, cmap="gray")
pylab.show()
激活函数:卷积操作后,通常还需要使用激活函数进一步处理图像。激活函数通常都是非线性的函数,目的是把线性数值映射到非线性空间中,让神经网络的表达能力更强大。
池化层:通常在两个卷积层中间,相当于对神经元的数据做降维处理,降低整体计算量。
全连接层:前面一层的输出结果链接当前层的每一个神经元,把前面计算出的所有特征输送给分类器。
#使用 LeNet 模型识别 Mnist 手写数字
#pip install keras
#pip install tensorflow
#pip install -U numpy
import keras
from keras.datasets import mnist
from keras.layers import Conv2D, MaxPool2D
from keras.layers import Dense, Flatten
from keras.models import Sequential
#加载数据
(train_x, train_y), (test_x, test_y) = mnist.load_data()
#print(train_x[0])
#结果为
# [[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0 0 0 0 3 18 18 18 126 136 175 26 166 255 247 127 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 30 36 94 154 170 253 253 253 253 253 225 172 253 242 195 64 0 0 0 0]
# [ 0 0 0 0 0 0 0 49 238 253 253 253 253 253 253 253 253 251 93 82 82 56 39 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 18 219 253 253 253 253 253 198 182 247 241 0 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 80 156 107 253 253 205 11 0 43 154 0 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0 14 1 154 253 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0 0 0 139 253 190 2 0 0 0 0 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0 0 0 11 190 253 70 0 0 0 0 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0 0 0 0 35 241 225 160 108 1 0 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0 0 0 0 0 81 240 253 253 119 25 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 45 186 253 253 150 27 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 93 252 253 187 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 249 253 249 64 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 130 183 253 253 207 2 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0 0 0 0 39 148 229 253 253 253 250 182 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0 0 24 114 221 253 253 253 253 201 78 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 23 66 213 253 253 253 253 198 81 2 0 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 18 171 219 253 253 253 253 195 80 9 0 0 0 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 55 172 226 253 253 253 253 244 133 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 136 253 253 253 212 135 132 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
print(train_y[0])
#结果为:
#5
print(train_x.shape[0])
#结果为:
#60000
train_x = train_x.reshape(train_x.shape[0], 28, 28, 1)
test_x = test_x.reshape(test_x.shape[0], 28, 28, 1)
train_x = train_x / 255
test_x = test_x / 255
train_y = keras.utils.to_categorical(train_y, 10)
test_y = keras.utils.to_categorical(test_y, 10)
#创建序贯模型,将多个网络层线性堆叠起来
model = Sequential()
#第一层卷积层,6 个卷积核,大小为 5*5,relu 激活函数
model.add(Conv2D(6, kernel_size=(5, 5), activation="relu", input_shape=(28, 28, 1)))
#第二层池化池,最大池化
#pool_size代表采样因子,比如下一行相当于将原来 22 的矩阵变成一个点
model.add(MaxPool2D(pool_size=(2, 2)))
#第三层卷积层,16 个卷积核,大小为 5*5,relu 激活函数
model.add(Conv2D(16, kernel_size=(5, 5), activation="relu"))
#第二层池化池,最大池化
model.add(MaxPool2D(pool_size=(2, 2)))
#将参数进行扁平化,在 LeNet5 称之为卷积层,实际上这一层是一维向量,和全连接层一样
model.add(Flatten())
model.add(Dense(120, activation="relu"))
#全连接层,输出节点个数为 84 个
model.add(Dense(84, activation="relu"))
#输出层,用 softmax 激活函数计算分类概率
model.add(Dense(10, activation="softmax"))
#设置损失函数和优化器配置
pile(loss=keras.metrics.categorical_crossentropy, optimizer=keras.optimizers.Adam(), metrics=["accuracy"])
#传入训练集
#epochs控制训练的次数
model.fit(train_x, train_y, batch_size=128, epochs=2, verbose=1, validation_data=(test_x, test_y))
#评估结果
score=model.evaluate(test_x, test_y)
print("误差:%0.4lf" % score[0])
print("准确率:", score[1])
#结果为:
# 误差:0.0625
# 准确率:0.9801
如果觉得《29 用 Keras 搭建深度学习网络识别手写数字》对你有帮助,请点赞、收藏,并留下你的观点哦!