15 手写数字识别-小数据集

  • from sklearn.datasets import load_digits
  • digits = load_digits()
  • #加载数据
    from sklearn.datasets import load_digits
    import numpy as np
    import pandas as pd
    from sklearn.preprocessing import MinMaxScaler
    from sklearn.preprocessing import OneHotEncoder
    digits=load_digits()
    
    #对X轴归一化,采用MinMaxScaler()
    X_data = digits.data.astype(np.float32)
    Y_data = digits.target.astype(np.float32).reshape(-1,1)
    print(X_data,Y_data)
    

 

2.图片数据预处理

  • x:归一化MinMaxScaler()
  • y:独热编码OneHotEncoder()或to_categorical
  • 训练集测试集划分
  • 张量结构
  • import numpy as np
    from sklearn.datasets import load_digits
    from sklearn.preprocessing import MinMaxScaler
    from sklearn.preprocessing import OneHotEncoder
    digits=load_digits()
    
    # 独热编码
    X_data = digits.data.astype(np.float32)
    Y_data = digits.target.astype(np.float32).reshape(-1,1)
    scale=MinMaxScaler()
    X_data=scale.fit_transform(X_data)
    # print(X_data)
    
    Y_hot=OneHotEncoder().fit_transform(Y_data).todense()
    print(Y_hot)
    
    
    
    
    ## 转图片格式
    X=X_data.reshape(-1,8,8,1)
    print(X.shape)
    
    
    from sklearn.model_selection import train_test_split
    X_train,X_test,y_train,y_test = train_test_split(X,Y_hot,test_size=0.25,random_state=0,stratify=Y_hot)
    
    print (X_train,X_test,y_train,y_test)
    

 

 

3.设计卷积神经网络结构

  • 绘制模型结构图,并说明设计依据。
from keras.models import Sequential
from keras.layers import Dense,Activation
model = Sequential()
model.add(Conv2D(
          filters=32,  # 输出32*32
          kernel_size=(5,5),  # 卷积核的大小
          padding='same',  # 保证卷积核大小,不够补零
          input_shape=X_train.shape[1:],  # (8, 8, 1)
          activation='relu')) 
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128,activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(10,activation='softmax'))

4.模型训练

  • model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
  • train_history = model.fit(x=X_train,y=y_train,validation_split=0.2, batch_size=300,epochs=10,verbose=2)
model.compile(loss='categorical_crossentropy',
             optimizer='adam',
             metrics=['accuracy'])
train_history=model.fit(x=X_train,y=y_train,validation_split=0.2,batch_size=300,epochs=50,verbose=2)

5.模型评价

  • model.evaluate()
  • 交叉表与交叉矩阵
  • pandas.crosstab
  • seaborn.heatmap
y-predict=model.predict_classes(X_test)
y_testtrue=np.argmax(y_test,axis=1).reshape(-1)
y_true=np.array(y_testtrue[0]).reshape(-1)
pd.crosstab(y_true,y-predict,rownames=['true'],colnames=['predict'])
## 交叉矩阵
import seaborn as sns
import matplotlib.pylot as plt

a=pd.crosstab(np.array(y_testtrue)[0].reshape(-1),y-predict)
df=pd.DataFrame(a)
sns.heatmap(df,annot=True,cmap="Purples",linewidths=0.2,linecolor="G")
plt.show()

 

课程作业
原文地址:https://www.cnblogs.com/lingcode/p/13126667.html