【问题标题】:keras and sigmoid not predict a right classkeras 和 sigmoid 不能预测正确的类别
【发布时间】:2021-05-23 21:07:12
【问题描述】:

我正在尝试拟合预测目标类别的模型,该目标类别可以是:0、1、2、3
在拟合期间,他的 val_accuracy 为:1.0
但他的预测是这样的:

数组([[1.2150223e-09]], dtype=float32)

X_train.shape 
#(1992, 1, 68)

model = Sequential()
model.add(LSTM(128, input_shape=(1,X_train.shape[2])))
model.add(Dense(128, activation="relu",kernel_regularizer=regularizers.l1_l2(l1=1e-5, l2=1e-4)))
model.add(Dropout(0.4))

model.add(Dense(1, activation="sigmoid"))

model.compile(optimizer='adam',loss='mae', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=100,batch_size=16, validation_split=0.1, shuffle=True

X_test = np.expand_dims(X_test,1)
y_test = np.expand_dims(y_test,1)
model.evaluate(X_test,y_test) 
#[0.0010176461655646563, 1.0]

data = np.expand_dims(data, 1)
model.predict(data) #array([[1.2150223e-09]], dtype=float32) <---- here expected was 0, 1, 2 or 3

data.shape #(1, 1, 68)

我不明白怎么回事

【问题讨论】:

    标签: python machine-learning keras neural-network lstm


    【解决方案1】:

    你的模型只有一个输出但是你有四个类,所以你需要将最后一个Dense层更改为model.add(Dense(4, activation="softmax"))sigmoid通常是用于binary 分类。在您的情况下,有 4 个类,因此需要使用 softmax。然后您将通过probabilities = model.predict(data) 获得概率,然后使用 CATEGORIES[np.argmax(probabilities)] 它提供了预测类。对了,要计算loss的时候,用multi-class cross entropy loss:model.compile(.., loss='categorical_crossentropy', ..)

    model.add(Dense(4, activation="softmax"))
    probabilities = model.predict(data)
    print(CATEGORIES[np.argmax(probabilities)])
    

    【讨论】:

    • with loss='categorical_crossentropy' 我回来了:ValueError: Shapes (16, 1) and (16, 1, 2) is incompatible in model.fit()
    • 最后一层和激活函数你也改了吗?
    • with: model.add(Dense(1, activation="softmax")) 工作,但准确度为 0
    • 你提到有4个类。因此,最终层输出需要相同。 model.add(Dense(4, activation="softmax"))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2020-07-05
    • 2020-05-27
    相关资源
    最近更新 更多