我为视频分类编写了一个简单的convLSTM脚本,但我得到了一个错误



我创建了一个对视频进行分类的convLSTM网络。数据集由6个类组成,其中包含视频。

我得到错误">名称错误:未定义名称"y_pred">"它与代码的倒数第三行有关。您不需要运行代码,因为它可能是语法错误或类似的问题。

为什么我会出现这个错误?

import keras
from keras import applications
from keras.preprocessing.image import ImageDataGenerator
from keras import optimizers
from keras.models import Sequential, Model 
from keras.layers import *
from keras.callbacks import ModelCheckpoint, LearningRateScheduler, TensorBoard, EarlyStopping

import os
import cv2
import numpy as np
from sklearn.model_selection import train_test_split
import keras_metrics as km


from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score
from sklearn.metrics import cohen_kappa_score
from sklearn.metrics import roc_auc_score
from sklearn.metrics import multilabel_confusion_matrix

data_dir = "video_data/"
img_height , img_width = 64, 64
seq_len = 70

classes = ["Apply Eye Makeup", "Archery", "Apply Lipstick", "Baby Crawling", "Balance Beam", "Band Marching"]

#  Creating frames from videos

def frames_extraction(video_path):
frames_list = []

vidObj = cv2.VideoCapture(video_path)
# Used as counter variable 
count = 1

while count <= seq_len: 

success, image = vidObj.read() 
if success:
image = cv2.resize(image, (img_height, img_width))
frames_list.append(image)
count += 1
else:
print("Defected frame")
break


return frames_list

def create_data(input_dir):
X = []
Y = []

classes_list = os.listdir(input_dir)

for c in classes_list:
print(c)
files_list = os.listdir(os.path.join(input_dir, c))
for f in files_list:
frames = frames_extraction(os.path.join(os.path.join(input_dir, c), f))
if len(frames) == seq_len:
X.append(frames)

y = [0]*len(classes)
y[classes.index(c)] = 1
Y.append(y)

X = np.asarray(X)
Y = np.asarray(Y)
return X, Y

X, Y = create_data(data_dir)

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.20, shuffle=True, random_state=0)

model = Sequential()
model.add(ConvLSTM2D(filters = 64, kernel_size = (3, 3), return_sequences = False, data_format = "channels_last", input_shape = (seq_len, img_height, img_width, 3)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(256, activation="relu"))
model.add(Dropout(0.3))
model.add(Dense(6, activation = "softmax"))

model.summary()

opt = keras.optimizers.SGD(lr=0.001)
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=["accuracy"])

earlystop = EarlyStopping(patience=7)
callbacks = [earlystop]

history = model.fit(x = X_train, y = y_train, epochs=40, batch_size = 8 , shuffle=True, validation_split=0.2, callbacks=callbacks)

y_pred = np.argmax(y_pred, axis = 1)
y_test = np.argmax(y_test, axis = 1)

print(classification_report(y_test, y_pred))

消息中的错误不言自明:y_pred未定义。。。

你必须首先预测你的数据,然后做一些类似y_pred = model.predict(X_test)的事情,你可以argmax,等等

[编辑]:总之,用替换最后三行

y_pred = model.predict(X_test)
y_pred = np.argmax(y_pred, axis = 1)

print(classification_report(y_test, y_pred))

最新更新