1.手写数字数据集
- from sklearn.datasets import load_digits
- digits = load_digits()
from sklearn.datasets import load_digits digits = load_digits()
2.图片数据预处理
- x:归一化MinMaxScaler()
-
# 对X进行归一化 from sklearn.preprocessing import MinMaxScaler import numpy as np x_data = digits.data.astype(np.float32) #数据转为float类型 #将属性缩放到一个指定的最大和最小值(通常0-1)之间,不影响其实特征 scaler = MinMaxScaler()#归一化 X_data =scaler.fit_transform(x_data) #scaler找到最大值最小值,tansform利用公式转换成-之间 print(X_data.shape) print(X_data) x = X_data.reshape(-1,8,8,1)##转换为图片的模式(张量结构),-1样本量,自动处理,8,8是图片尺寸,1是通道数目;
- y:独热编码OneHotEncoder()或to_categorical
-
# y:独热编码 from sklearn.preprocessing import OneHotEncoder #将分类特征每一个元素转换成一个可以用来计算的值 y_data = digits.target.astype(np.float32).reshape(-1,1) #将y_data变为一列 print(y_data)#每列数据 y = OneHotEncoder().fit_transform(y_data).todense() #独热编码并转张量类型 #fit用来学习编码 print(y)#标识数组
- 训练集测试集划分
-
#训练集和测试集划分 from sklearn.model_selection import train_test_split #分出数据不参与模型训练,用于测试模型好坏 x_train , x_test , y_train , y_test = train_test_split(x,y,test_size=0.2,random_state=0,stratify=y)#随机自动划分一部分,百分之20 print(x_train.shape, x_test.shape, y_train.shape, y_test.shape
- 张量结构
3.设计卷积神经网络结构
- 绘制模型结构图,并说明设计依据。
-
#建立模型 #3.设计卷积神经网络结构 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense,Dropout,Conv2D,MaxPool2D,Flatten #3、建立模型 model = Sequential() ks = (3, 3) #定义第一层的卷积核的大小 input_shape = x_train.shape[1:] # 一层卷积,padding='same',tensorflow会对输入自动补0 #设置第一次定义的卷积核个数 #第一层输入数据shape指定,剩下的会自动运算 model.add(Conv2D(filters=16, kernel_size=ks, padding='same', input_shape=input_shape, activation='relu'))# 池化层1 #设置ks卷积核大小不变 model.add(MaxPool2D(pool_size=(2, 2)))# 防止过拟合,随机丢掉连接,丢掉一下参数 model.add(Dropout(0.25))# 二层卷积 model.add(Conv2D(filters=32, kernel_size=ks, padding='same', activation='relu'))# 池化层2 model.add(MaxPool2D(pool_size=(2, 2))) model.add(Dropout(0.25))# 三层卷积,丢掉0.25的链接 model.add(Conv2D(filters=64, kernel_size=ks, padding='same', activation='relu'))# 四层卷积 model.add(Conv2D(filters=128, kernel_size=ks, padding='same', activation='relu'))# 池化层3 model.add(MaxPool2D(pool_size=(2, 2))) model.add(Dropout(0.25))# 平坦层,丢掉0.25的链接 model.add(Flatten())# 全连接层 model.add(Dense(128, activation='relu'))# 激活函数softmax model.add(Dropout(0.25))#丢掉0.25的链接 model.add(Dense(10, activation='softmax')) print(model.summary())
4.模型训练
#训练模型 import matplotlib.pyplot as plt model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy']) #优化器optimizer='adam' #每次利用256进行测试,0.2用于验证 #epochs 设置训练次数 train_history = model.fit(x=x_train,y=y_train, validation_split=0.2, batch_size=256, epochs=10,verbose=2) score = model.evaluate(x_test,y_test) #模型自动评估 #预测值 y_pred = model.predict_classes(x_test) print(y_pred) #观察训练参数可视化 def show_train_history(train_histoty, train, validataion): plt.plot(train_history.history[train]) plt.plot(train_history.history[validataion]) plt.title('Train History') plt.ylabel('train') plt.xlabel('epoch') plt.legend(['train', 'validation'], loc='upper left') plt.show() #准确率 show_train_history(train_history, 'accuracy', 'val_accuracy') #损失率 show_train_history(train_history, 'loss', 'val_loss')
准确率
损失率
5.模型评价
- model.evaluate()
- 交叉表与交叉矩阵
- pandas.crosstab
- seaborn.heatmap
#方模型评估 model.evaluate(x_test,y_test)[1]
-
#预测值 y_pre = model.predict_classes(x_test) y_pre[:10]
#交叉表查看预测数据与原数据对比 y_test1 = np.argmax(y_test, axis=1).reshape(-1) #一维数组模式 y_true = np.array(y_test1)[0] import pandas as pd pd.crosstab(y_true, y_pred, rownames=['true'], colnames=['predict']) # 交叉表与交叉矩阵 import seaborn as sns import pandas as pd y_test1 = y_test1.tolist()[0] a = pd.crosstab(np.array(y_test1),y_pred) df = pd.DataFrame(a) #转换成属dataframe sns.heatmap(df,annot=True,cmap='Reds',linewidths=0.2, linecolor='G') #热图
-
完整代码
-
from sklearn.datasets import load_digits digits = load_digits() # 对X进行归一化 from sklearn.preprocessing import MinMaxScaler import numpy as np x_data = digits.data.astype(np.float32) #数据转为float类型 #将属性缩放到一个指定的最大和最小值(通常0-1)之间,不影响其实特征 scaler = MinMaxScaler()#归一化 X_data =scaler.fit_transform(x_data) #scaler找到最大值最小值,tansform利用公式转换成-之间 print(X_data.shape) print(X_data) x = X_data.reshape(-1,8,8,1)##转换为图片的模式(张量结构),-1样本量,自动处理,8,8是图片尺寸,1是通道数目; # y:独热编码 from sklearn.preprocessing import OneHotEncoder #将分类特征每一个元素转换成一个可以用来计算的值 y_data = digits.target.astype(np.float32).reshape(-1,1) #将y_data变为一列 print(y_data)#每列数据 y = OneHotEncoder().fit_transform(y_data).todense() #独热编码并转张量类型 #fit用来学习编码 print(y)#标识数组 #训练集和测试集划分 from sklearn.model_selection import train_test_split #分出数据不参与模型训练,用于测试模型好坏 x_train , x_test , y_train , y_test = train_test_split(x,y,test_size=0.2,random_state=0,stratify=y)#随机自动划分一部分,百分之20 print(x_train.shape, x_test.shape, y_train.shape, y_test.shape) #建立模型 #3.设计卷积神经网络结构 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense,Dropout,Conv2D,MaxPool2D,Flatten #3、建立模型 model = Sequential() ks = (3, 3) #定义第一层的卷积核的大小 input_shape = x_train.shape[1:] # 一层卷积,padding='same',tensorflow会对输入自动补0 #设置第一次定义的卷积核个数 #第一层输入数据shape指定,剩下的会自动运算 model.add(Conv2D(filters=16, kernel_size=ks, padding='same', input_shape=input_shape, activation='relu'))# 池化层1 #设置ks卷积核大小不变 model.add(MaxPool2D(pool_size=(2, 2)))# 防止过拟合,随机丢掉连接,丢掉一下参数 model.add(Dropout(0.25))# 二层卷积 model.add(Conv2D(filters=32, kernel_size=ks, padding='same', activation='relu'))# 池化层2 model.add(MaxPool2D(pool_size=(2, 2))) model.add(Dropout(0.25))# 三层卷积,丢掉0.25的链接 model.add(Conv2D(filters=64, kernel_size=ks, padding='same', activation='relu'))# 四层卷积 model.add(Conv2D(filters=128, kernel_size=ks, padding='same', activation='relu'))# 池化层3 model.add(MaxPool2D(pool_size=(2, 2))) model.add(Dropout(0.25))# 平坦层,丢掉0.25的链接 model.add(Flatten())# 全连接层 model.add(Dense(128, activation='relu'))# 激活函数softmax model.add(Dropout(0.25))#丢掉0.25的链接 model.add(Dense(10, activation='softmax')) print(model.summary()) #训练模型 import matplotlib.pyplot as plt model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy']) #优化器optimizer='adam' #每次利用256进行测试,0.2用于验证 #epochs 设置训练次数 train_history = model.fit(x=x_train,y=y_train, validation_split=0.2, batch_size=256, epochs=10,verbose=2) score = model.evaluate(x_test,y_test) #模型自动评估 #预测值 y_pred = model.predict_classes(x_test) print(y_pred) #观察训练参数可视化 def show_train_history(train_histoty, train, validataion): plt.plot(train_history.history[train]) plt.plot(train_history.history[validataion]) plt.title('Train History') plt.ylabel('train') plt.xlabel('epoch') plt.legend(['train', 'validation'], loc='upper left') plt.show() #准确率 show_train_history(train_history, 'accuracy', 'val_accuracy') #损失率 show_train_history(train_history, 'loss', 'val_loss') #方模型评估 model.evaluate(x_test,y_test)[1] #预测值 y_pre = model.predict_classes(x_test) y_pre[:10] #交叉表查看预测数据与原数据对比 y_test1 = np.argmax(y_test, axis=1).reshape(-1) #一维数组模式 y_true = np.array(y_test1)[0] import pandas as pd pd.crosstab(y_true, y_pred, rownames=['true'], colnames=['predict']) # 交叉表与交叉矩阵 import seaborn as sns import pandas as pd y_test1 = y_test1.tolist()[0] a = pd.crosstab(np.array(y_test1),y_pred) df = pd.DataFrame(a) #转换成属dataframe sns.heatmap(df,annot=True,cmap='Reds',linewidths=0.2, linecolor='G') #热图