我想使用深度学习进行多类分类(softmax,keras)。所以,我建立了模型,得到了误差,就是期望输出形状和实际输出形状不同。在我的例子中,类型是1,2,3,所以预期的形状是3(3类),但实际形状是4。当将1、2、3更改为0、1、2或将“期望形状”设置为4时,此错误已解决。后者是指将三级分类改为四级分类。为什么要运行此代码?在这种情况下,什么是预测概率?我如何评价这些结果?在
这是示例代码。在
from sklearn import datasets
iris = datasets.load_iris()
# X -> features, y -> label
X = iris.data
y = iris.target
mini_dict = {0: 'a', 1: 'b', 2: 'c'}
y = pd.Series(y, name=None).replace(mini_dict)
mini_dict = {'a': 3, 'b': 1, 'c': 2}
y = pd.Series(y, name=None).replace(mini_dict)
def multiclass_model():
model = Sequential()
model.add(Dense(10,input_dim=4))
model.add(Dropout(0.1))
model.add(Dense(3,activation='softmax')) #this is expected shape
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy','categorical_accuracy'])
return (model)
model=KerasClassifier(build_fn=multiclass_model, epochs=20, batch_size=3, verbose=0)
model.fit(X,y.values)
得到这个错误。在
^{pr2}$然后重新定义多类模型
def multiclass_model():
model = Sequential()
model.add(Dense(10,input_dim=4))
model.add(Dropout(0.1))
model.add(Dense(4,activation='softmax')) #change 3 to 4
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy','categorical_accuracy'])
return (model)
model=KerasClassifier(build_fn=multiclass_model, epochs=20, batch_size=3, verbose=0)
model.fit(X,y.values)
没有错误,我可以得到预测值。在
model.predict_proba(X[0:5])
array([[2.52738446e-05, 2.23150160e-02, 3.87168024e-04, 9.77272570e-01],
[5.91093449e-05, 4.23159041e-02, 1.24582055e-03, 9.56379175e-01],
[5.94217017e-05, 3.10160406e-02, 7.65587494e-04, 9.68158960e-01],
[1.07116306e-04, 4.50214930e-02, 1.48290978e-03, 9.53388453e-01],
[2.73615278e-05, 2.02178583e-02, 3.34151875e-04, 9.79420602e-01]],
dtype=float32)
y.values[:5]
array([3, 3, 3, 3, 3])
我不知道这些值的可靠性。在
检查班级人数
np.unique(y.values)
array([1, 2, 3])
当你想进行多类分类时,你需要对你的标签向量做一个}。在下一步中,这些标签将被
one-hot encoding
。由于您的y.values
输出,我假设您的y
看起来是[1,2,3,2...]
。然而,TensorflowsKerasClassifier
负责处理这一点,这可以在源代码中看到。(source)因此您的标签将变成这样的{one-hot
编码,这也可以在源代码中看到。(source)现在您的标签看起来像这样[[1,0,0],[0,1,0],[0,0,1],[0,1,0]]
。在所以根据我的理解,如果在输出层中只使用3个类而不是4个类,那么一切都应该正常工作。在
所以再次检查标签数据
y
,例如np.unique(y.values)
。我的猜测是您无意中创建了一个包含[0,1,2,3]
的标签向量。在相关问题 更多 >
编程相关推荐