【问题标题】:what is the problem in my predict function? [duplicate]我的预测功能有什么问题? [复制]
【发布时间】:2020-05-20 02:29:56
【问题描述】:

我正在研究二进制视频分类问题,我将每个视频转换为 7 个图像,并使用 vgg16 从这些图像中提取特征,然后将图像序列提供给我的 LSTM

LSTM 与序列一起工作,这意味着每 7 个图像都是一个带有单个标签的序列,所以在我提取了我的特征之后,我必须创建我的标签(一个标签用于一个 7 个图像的序列),然后用我的数据

我使用 (keras.utils.to_categorical) 对我创建的标签进行编码,然后我将它提供给 LSTM,第一类使用一个,第二类使用零,但是当我尝试在小训练后进行预测时,它给了我结果不同的数字不是零或一,尽管当我用这些数字喂它时它必须给我零或一

我不在乎我的准确性或损失百分比我只想知道为什么我得到不同的类值

这是我在 LSTM 和标签创建过程中的代码:

在这里我创建了 2 个数组,一个有 45 个(一等)和 45 个零(二等)用于 108 个序列用于训练,另一个数组有 11 个(一)和 11 个零(二等)用于验证,我使用 (keras.utils.to_categorical)

t_labels = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
v_labels = [1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0]
t_labels= keras.utils.to_categorical(t_labels, num_classes=2)
v_labels= keras.utils.to_categorical(v_labels, num_classes=2)

这是我的 LSTM:

lstm1 = Sequential()
lstm1.add(LSTM(100, activation='relu', return_sequences=True, input_shape=(7,25088)))
lstm1.add(LSTM(60, activation='relu'))
lstm1.add(Dropout(0.6))
lstm1.add(Dense(20, activation='relu'))
lstm1.add(Dense(10, activation='relu'))
lstm1.add(Dense(2 , activation='softmax'))

from tensorflow.keras.optimizers import Adam
adam = Adam(lr=2e-5,beta_1=0.9, beta_2=0.999)

lstm1.compile(optimizer=adam, loss='binary_crossentropy',metrics=['accuracy'])

lstm1.fit(lstm_train_sample , t_labels , epochs=30 , batch_size=9 , validation_data=(lstm_validation_sample,v_labels) , validation_batch_size= 2 )

features_batch = lstm1.predict(lstm_validation_sample,batch_size=1)
features_batch
array([[7.10002226e-08, 9.99999881e-01],
       [1.12060457e-06, 9.99998927e-01],
       [5.34564265e-07, 9.99999523e-01],
       [6.33320667e-07, 9.99999404e-01],
       [3.10866085e-06, 9.99996901e-01],

所以如果我尝试打印我的标签,它看起来像这样:

 [0., 1.],
       [0., 1.],
       [0., 1.],
       [0., 1.],
       [1., 0.],
       [1., 0.],
       [1., 0.],
       [1., 0.],
       [1., 0.],

但是当我尝试预测结果时,看起来就像我在上面显示的那样:

array([[7.10002226e-08, 9.99999881e-01],
       [1.12060457e-06, 9.99998927e-01],
       [5.34564265e-07, 9.99999523e-01],
       [6.33320667e-07, 9.99999404e-01],
       [3.10866085e-06, 9.99996901e-01],

我现在不在乎,即使损失是 100%,它应该只是向我显示我使用的标签的错误答案,而不是这个奇怪的数字

所以如果有人知道问题出在哪里或我在代码中犯了什么错误,我需要一些帮助

【问题讨论】:

  • 代码没有错,只是您对预测输出的错误解释,请参阅关于如何获取类索引的重复答案

标签: keras


【解决方案1】:

如果您的目标特征中只有两个类,我建议您在模型的最后一层使用“Sigmoid”激活函数而不是“Softmax”。 Softmax 激活主要用于多类分类。

更改这行代码:

lstm1.add(Dense(2 , activation='softmax'))

收件人:

lstm1.add(Dense(2 , activation='sigmoid'))

看看有没有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 2022-06-13
    • 2018-02-19
    • 2015-05-27
    • 2018-03-22
    相关资源
    最近更新 更多