公众号:机器学习杂货店 作者:Peter 编辑:Peter
持续更新《Python深度学习》一书的精华内容,仅作为学习笔记分享。
本文是第一篇:深度学习中的数学基础和张量操作
In 1:
代码语言:txt复制import pandas as pd
import numpy as np
import tensorflow as tf
加载MNIST数据集
MNIST数据集是一个大型的手写数字识别数据集,由美国国家标准技术研究所(NIST)收集并公开提供。该数据集包含约70000张手写数字图像,每张图像都是28x28像素大小的,灰度模式。
这些图像分为两个部分:训练集和测试集。训练集包含60000张图像,用于训练和调整模型参数;测试集包含10000张图像,用于评估模型的性能。
MNIST数据集是机器学习领域中非常常用的的一种数据集,特别是对于初学者来说。它是一个很好的起点,可以用来了解和比较各种机器学习算法的性能,例如神经网络、支持向量机、决策树等。通过训练和测试,可以评估各种算法在手写数字识别任务上的性能,以及它们的泛化能力。
In 2:
代码语言:txt复制from keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
查看数据基本信息:
In 3:
代码语言:txt复制train_images.shape
Out3:
代码语言:txt复制(60000, 28, 28)
In 4:
代码语言:txt复制train_labels.shape
Out4:
代码语言:txt复制(60000,)
In 5:
代码语言:txt复制test_images.shape
Out5:
代码语言:txt复制(10000, 28, 28)
In 6:
代码语言:txt复制test_labels.shape
Out6:
代码语言:txt复制(10000,)
显示数字图像
In 7:
代码语言:txt复制digit = train_images[9]
digit[:5]
Out7:
代码语言:txt复制array([[ 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, 189, 190, 0, 0,
0, 0]], dtype=uint8)
In 8:
代码语言:txt复制import matplotlib.pyplot as plt
plt.imshow(digit, cmap=plt.cm.binary)
plt.show()
准备图像数据
数据缩放(除以255)和数据类型转化,神经网络只能处理浮点数类型数据float32
In 9:
代码语言:txt复制train_images = train_images.reshape((60000, 28*28))
train_images = train_images.astype("float32") / 255
test_images = test_images.reshape((10000, 28*28))
test_images = test_images.astype("float32") / 255
标签分类(有修改)
In 10:
代码语言:txt复制# 标签实施独热码to_categorical
# 原文
# from keras.utils import to_categorical
# 修改
from tensorflow.keras.utils import to_categorical
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
In 11:
代码语言:txt复制train_labels
Out11:
代码语言:txt复制array([[0., 0., 0., ..., 0., 0., 0.],
[1., 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., 1., 0.]], dtype=float32)
构建网络架构
In 12:
代码语言:txt复制from keras import models
from keras import layers
network = models.Sequential() # 实例化
# 添加两个全连接层(密集连接层):Dense层
network.add(layers.Dense(512,
activation='relu',
input_shape=(28*28, ))) # input_shape的第一个参数如何确定
# 第二个全连接层:softmax层,返回10个概率值,总和为1
network.add(layers.Dense(10,activation='softmax'))
编译网络模型
In 13:
代码语言:txt复制network.compile(optimizer="rmsprop", # 优化器
loss="categorical_crossentropy", # 损失函数
metrics=["accuracy"] # 评价指标:分类精度
)
模型拟合fit
In 14:
代码语言:txt复制network.fit(train_images,
train_labels,
epochs=5,
batch_size=128)
Epoch 1/5
469/469 [==============================] - 2s 4ms/step - loss: 0.2650 - accuracy: 0.9227
Epoch 2/5
469/469 [==============================] - 2s 4ms/step - loss: 0.1075 - accuracy: 0.9688
Epoch 3/5
469/469 [==============================] - 2s 4ms/step - loss: 0.0714 - accuracy: 0.9780
Epoch 4/5
469/469 [==============================] - 2s 4ms/step - loss: 0.0524 - accuracy: 0.9844
Epoch 5/5
469/469 [==============================] - 2s 4ms/step - loss: 0.0403 - accuracy: 0.9881
Out14:
代码语言:txt复制<keras.callbacks.History at 0x24660809d60>
显示了网络在训练数据上的损失loss和精度accuracy
模型评价
In 15:
代码语言:txt复制test_loss, test_acc = network.evaluate(test_images, test_labels)
313/313 [==============================] - 0s 863us/step - loss: 0.0685 - accuracy: 0.9788
模型在训练集上表现得很好,但是在测试集上性能表现得要差些,这种现象称之为过拟合
神经网络的数据张量
标量-0D张量
In 16:
代码语言:txt复制# 仅仅包含单个数字,包含0个轴(ndim)
import numpy as np
x = np.array(12)
x
Out16:
代码语言:txt复制array(12)
In 17:
代码语言:txt复制x.ndim # 查看轴的个数,称之为rank
Out17:
代码语言:txt复制0
In 18:
代码语言:txt复制x.size # 表示张量中的元素个数
Out18:
代码语言:txt复制1
向量-1D张量
In 19:
代码语言:txt复制x = np.array([9,8,1,12])
x
Out19:
代码语言:txt复制array([ 9, 8, 1, 12])
In 20:
代码语言:txt复制x.ndim
Out20:
代码语言:txt复制1
In 21:
代码语言:txt复制x.size
Out21:
代码语言:txt复制4
矩阵-2D张量
In 22:
代码语言:txt复制x = np.array([[9,8,1,12],
[2,3,4,5],
[10,5,2,7]
])
x
Out22:
代码语言:txt复制array([[ 9, 8, 1, 12],
[ 2, 3, 4, 5],
[10, 5, 2, 7]])
In 23:
代码语言:txt复制x.ndim
Out23:
代码语言:txt复制2
In 24:
代码语言:txt复制x.size
Out24:
代码语言:txt复制12
关键属性
In 25:
代码语言:txt复制# 1、轴的个数ndim
x.ndim
Out25:
代码语言:txt复制2
In 26:
代码语言:txt复制# 2、形状shape
x.shape
Out26:
代码语言:txt复制(3, 4)
In 27:
代码语言:txt复制# 3、数据类型
x.dtype
Out27:
代码语言:txt复制dtype('int32')
In 28:
代码语言:txt复制# 4、元素个数size
x.size
Out28:
代码语言:txt复制12
现实数据中的张量
- 向量:2D, (samples, features)
- 时间序列数据:3D, (samples, timesteps, features)
- 图像:4D,(smaples, height, width, channels) or (samples, channels, height, width)
- 视频: 5D,(smaples, frames,height, width, channels) or (samples, frames,channels, height, width)