首页 > 解决方案 > 我的预测功能有什么问题?

问题描述

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

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

我使用 (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

解决方案


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

更改这行代码:

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

至 :

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

看看是否有帮助。


推荐阅读