深度学习(一)
一、实验目的
掌握前馈全连接神经网络,具体包括:
(1) 前馈全连接神经网络的网络结构
(2) 前馈神全连接经网络的工作原理
(3) 前馈全连接神经网络的代码实现
二、实验内容
1. 导入常用工具包
2. 数据导入与数据观察
3. 数据预处理
4. 前馈全连接神经网络(Sequential模型)
5. 课堂练习:尝试用之前介绍的Sequential()方法,构建前馈全连接神经网络对鸢尾花数据集进行分类
三、实验步骤及结果
1. 导入常用工具包
NumPy: 这是一个强大的数学库,用于进行数值计算。它提供了多维数组对象和一系列数学函数,可以用来处理线性代数、傅里叶变换、随机数等。
Pandas: 这是一个数据分析和操作的库,提供了DataFrame对象,可以用来处理结构化数据(类似于Excel表格)。它支持数据的导入导出、索引、数据清洗、数据可视化等功能。
Matplotlib: 这是一个绘图库,用于创建静态、交互式和动画可视化。它提供了丰富的函数来生成条形图、散点图、线图、饼图等不同类型的图表。
sklearn.datasets: 这是Scikit-learn库的一部分,专门用于加载流行的数据集,如Iris、digits、wine等,用于机器学习实验。
sklearn.model_selection: 同样是Scikit-learn库的一部分,提供了数据集划分、交叉验证、学习曲线等模型选择和评估的功能。
tensorflow.keras.layers: TensorFlow是一个开源的机器学习库,其keras接口提供了一种更简洁、更模块化的方式来构建和训练神经网络。layers模块包含构建神经网络所需的各种层,如Input、Dense(全连接层)、concatenate(拼接层)等。
tensorflow.keras.models: 这是TensorFlow Keras接口的一部分,用于构建和训练模型。Model类是主要的构造块,用于创建神经网络模型。
tensorflow.keras.backend: 这是TensorFlow Keras的底层接口,提供了许多在构建和训练模型时可能需要的底层函数和常量。它允许用户直接与TensorFlow的后端进行交互,进行高级操作。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from tensorflow.keras.layers import Input, Dense, concatenate
from tensorflow.keras.models import Model
from tensorflow.keras import backend as K
2.数据导入与观察数据
path = "C:/Users/14919/OneDrive/Desktop/工坊/深度学习-工坊/MNIST/"
train_Data = pd.read_csv(path+'mnist_train.csv',header = None) # 训练数据
test_Data= pd.read_csv(path+'mnist_test.csv',header = None) # 测试数据
# 观察数据
print('Train data')
train_Data.info()
print('nTest data')
test_Data.info()
使用Python的pandas库来读取MNIST数据集的训练集和测试集。MNIST数据集是一个手写数字的数据集,包含了0到9的手写数字的图片。
定义=一个路径path,这个路径是指向MNIST数据集所在的文件夹。然后使用pandas的read_csv函数读取训练集和测试集的数据,并将数据的表头设置为None,这意味着数据文件中没有表头。
使用info()函数来观察数据的信息。这个函数会输出数据的基本信息,包括数据的行数、列数、每列的数据类型、非空值的数量等。
x = train_Data.iloc[0] # 取第一行数据
y = x[0] # 标签信息
img = x[1:].values.reshape(28,28) # 将1*784行转化成28*28
plt.imshow(img) # 画图
plt.title('label = '+ str(y))
plt.show()
从MNIST数据集中提取第一行数据,将其解析为图像和对应的标签,并使用matplotlib库来显示这个图像。
x = train_Data.iloc[0]:使用pandas的`iloc`方法来提取训练数据集的第一行。在MNIST数据集中,每一行代表一个手写数字的图像,第一列是标签(即这个图像代表的数字),其余列是图像的像素值。
y = x[0]:从第一行数据中提取第一个元素,即图像的标签。这个标签是一个整数,表示图像中的手写数字。
img = x[1:].values.reshape(28,28):从第一行数据中提取从第二个元素开始的所有元素,即图像的像素值。.values将pandas的Series对象转换为NumPy数组,然后使用reshape方法将这个一维数组转换为一个28x28的二维数组。这是因为MNIST图像的原始大小是28x28像素。
plt.imshow(img):使用matplotlib的imshow函数来显示图像。这个函数可以显示二维数组作为图像。
plt.title('label = '+ str(y)):设置图像的标题,显示图像的标签。
plt.show():调用`show`函数来显示图像。这会在一个新的窗口中显示图像,标题为图像的标签。
3.数据预处理
X = train_Data.iloc[:,1:].values
y = train_Data.iloc[:,0].values
print("数据X中的最大值:",X.max())
print("数据X中的最小值:",X.min())
X = train_Data.iloc[:,1:].values:使用pandas的iloc方法来提取训练数据集中所有行的第2列到最后一列的数据,即所有图像的像素值。.values将提取的数据转换为NumPy数组。这样,X就变成了一个二维数组,其中每个元素都是一个图像的所有像素值,且每个图像展平为一个长度为784(28x28)的一维数组。
y = train_Data.iloc[:,0].values:使用iloc方法提取训练数据集中所有行的第1列数据,即所有图像的标签。这样,y就变成了一个一维数组,其中每个元素都是一个图像对应的数字标签。
print("数据X中的最大值:",X.max()):使用NumPy的max函数来找出X中的最大值,并打印出来。这个最大值代表了图像中像素的最大亮度值,对于MNIST数据集,由于像素值是灰度值,最大值为255,代表白色。
print("数据X中的最小值:",X.min()):使用NumPy的min函数来找出X中的最小值,并打印出来。这个最小值代表了图像中像素的最小亮度值,对于MNIST数据集,最小值为0,代表黑色。
# 归一化
X = X/255
# 此时将数值大小缩小在[0,1]范围内,重新观察数据中的最大、小值
print("数据X中的最大值:",X.max())
print("数据X的最小值:",X.min())
对特征数据X进行了归一化处理。归一化是一种常用的数据预处理技术,它将数据缩放到一个特定的范围,通常是[0, 1]或[-1, 1]。在这个例子中,数据被缩放到了[0, 1]的范围内。
X_valid, X_train = X[:5000],X[5000:]
y_valid, y_train = y[:5000],y[5000:]
X_test,y_test = test_Data.iloc[:,1:].values/255, test_Data.iloc[:,0].values
从原始的MNIST训练数据集中分割出一个验证集和一个新的训练集,并对测试集进行归一化处理。