这是学习用keras框架组装神经网络进行学习的第二个台阶,使用softmax函数来进行多分类模型的搭建。
源码下载:https://download.csdn.net/download/rance_king/11010033
- 导入包
import keras
#这是一个用来导入数据集的包
from sklearn import datasets
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import Adam
#keras框架中的分类包
from keras.utils.np_utils import to_categorical
- 在坐标系中放置五组点,分别以五个中心进行高斯分布,通过dataset里面的功能对五个点打上0-4的标签,并且将这些点画在坐标系上。
n_pts = 500
centers = [[-1, 1], [-1, -1], [1, -1], [1, 1], [0, 0]]
#dataset.make_*用于取出制造一个数据集,centers是一个二维数组,取出中心来用,cluster_std是离散程度
X, y = datasets.make_blobs(n_samples=n_pts, random_state = 220, centers=centers, cluster_std=0.3)
这里有一个我以前一直没有注意到的问题,就是,datasets里面的每个点的值是如何按照标签被取出来的?X只是一个包含了坐标的矩阵,y只是标签,而X[y==1, 0] 为什么能够取出我希望得到的横坐标呢?这里用的是一个np.array中通过布尔值取值的技巧 y == 1返回了一个布尔数组,筛选了对应标签为1的数(这里依然有疑问,为什么可以这样对应呢?),所以取得了相应的坐标点。
plt.scatter(X[y==0, 0], X[y==0, 1])
plt.scatter(X[y==1, 0], X[y==1, 1])
plt.scatter(X[y==2, 0], X[y==2, 1])
plt.scatter(X[y==3, 0], X[y==3, 1])
plt.scatter(X[y==4, 0], X[y==4, 1])
结果如图
3. 这里需要重点注意的是,在多分类的模型里面,y的标签需要使用one-hot的形式,即将单个的标签,比如3,变成一个数组[0,0,1,0,0],这样可以在之后的交叉熵计算中利用起来(使用softmax也是同样的原因,即为了在最后的输出层得出总和为一的概率分布。)
y_cat = to_categorical(y, 5)
- 紧接着开始实例化model,损失函数填’categorical_crossentropy’
model = Sequential()
model.add(Dense(5, input_shape=(2,), activation='softmax'))
model.compile(Adam(lr=0.1), 'categorical_crossentropy', metrics=['accuracy'])
- 后续代码与之前的文章相似,无需多说,唯独不同的是,之前的model.predict 要换成model.predict_classes
def plot_multiclass_decision_boundary(X, y, model):
x_span = np.linspace(min(X[:,0]) - 1, max(X[:,0]) + 1)
y_span = np.linspace(min(X[:,1]) - 1, max(X[:,1]) + 1)
xx, yy = np.meshgrid(x_span, y_span)
grid = np.c_[xx.ravel(), yy.ravel()]
pred_func = model.predict_classes(grid)
z = pred_func.reshape(xx.shape)
plt.contourf(xx, yy, z)
plot_multiclass_decision_boundary(X, y_cat, model)
plt.scatter(X[y==0, 0], X[y==0, 1])
plt.scatter(X[y==1, 0], X[y==1, 1])
plt.scatter(X[y==2, 0], X[y==2, 1])
plt.scatter(X[y==3, 0], X[y==3, 1])
plt.scatter(X[y==4, 0], X[y==4, 1])
plot_multiclass_decision_boundary(X, y_cat, model)
plt.scatter(X[y==0, 0], X[y==0, 1])
plt.scatter(X[y==1, 0], X[y==1, 1])
plt.scatter(X[y==2, 0], X[y==2, 1])
plt.scatter(X[y==3, 0], X[y==3, 1])
plt.scatter(X[y==4, 0], X[y==4, 1])
x = -0.5
y = -0.5
point = np.array([[x, y]])
prediction = model.predict_classes(point)
plt.plot([x], [y], marker='o', markersize=10, color="yellow")
print("Prediction is: ", prediction)
最终结果如下: