首先导入所需要的库 import tensorflow as tf from keras.models import Model # 泛型模型 from keras.layers import Dense, Input import matplotlib.pyplot as plt import h5py from sklearn import tree 没有的可以使用pip install 库名 进行下载 导入所需要提取的图片数据 path = './usps.h5' with h5py.File(path, 'r') as hf: train = hf.get('train') x_trian = train.get('data')[:]#0-1 float x_target = train.get('target')[:] # train数据集合的权重 0-9 test = hf.get('test') Y_test = test.get('data')[:] Y_target = test.get('target')[:] 设置最低特征压缩维度 # 压缩特征维度至120维 encoding_dim = 120 设置输入数据维度 # this is our input placeholder input_img = Input(shape=(256,)) 设置编码层,维度下降的越缓慢越好,但是层数太多运行速度会很慢 # 编码层 encoded = Dense(220, activation='sigmoid')(input_img)#(-1,1),activity_regularizer=sparse encoded = Dense(200, activation='sigmoid')(encoded) encoded = Dense(170, activation='sigmoid')(encoded) encoded = Dense(150, activation='sigmoid')(encoded) encoder_output = Dense(encoding_dim)(encoded) 和编码层对称 # 解码层 decoded = Dense(150, activation='sigmoid')(encoder_output)#(0.1) decoded = Dense(170, activation='sigmoid')(decoded) decoded = Dense(200, activation='sigmoid')(decoded) decoded = Dense(220, activation='sigmoid')(decoded) decoded = Dense(256, activation='sigmoid')(decoded) #(0,max) 构建编码层的模型,用来提取编码层的特征 #构建编码模型,提取特征,输入数据(input_img)和输出编码层数据(encoder_output) encoder =Model(inputs=input_img,outputs=encoder_output) 同理,构建解码层的模型,用来提取编码层的特征 # 构建稀疏自编码模型输入数据(input_img)和输出解码层数据(decoder) autoencoder = Model(inputs=input_img, outputs=decoded) 对解码层模型进行适配,寻找最优点可以通过修改优化器下降速度和损失函数的类型来是模型更接近最优值,不至于达到局部最优 # compile autoencoder autoencoder.compile(optimizer=tf.keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-06),loss='mse')#优化器二阶 损失函数为均方误差 模型适配的运行结果 执行700次之后的收敛情况 几乎没有太大变动了,可以看出其已达”最优解“,如果最终准确率还是不理想也可以调节优化器的学习率,或者更换优化器或损失函数 #训练cnn模型 autoencoder.fit(x_trian, x_trian, epochs=700, batch_size=30, shuffle=True) 对输入数据和预测数据提取主要特征 t1=encoder.predict(x_trian) t2=encoder.predict(Y_test) #使用已经调好参数的决策树模型 clf = tree.DecisionTreeClassifier(criterion='entropy', min_samples_leaf=5, max_depth=11, min_samples_split=7,random_state=42) #训练决策树模型 clf.fit(t1,x_target) #使用决策树模型进行预测 t=clf.predict(t2) 进行柱状图可视化展示 x_label=[0,1,2,3,4,5,6,7,8,9] y_label=[0,0,0,0,0,0,0,0,0,0] k=0 for i in range(len(t)): if Y_target[i]!=t[i]: print("分错样本为:{}\t原样本:{}".format(t[i],Y_target[i])) y_label[Y_target[i]]+=1 k+=1 print("准确率为:{} 分错个数{} 总数{}".format((len(t)-k)/len(t),k,len(t))) #进行画图 plt.bar(x_label,y_label, 0.4, color="green") plt.xlabel("origin") plt.ylabel("number") plt.title("tree") plt.show()
可视化展示结果