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

Python 我为视频分类编写了一个简单的convLSTM脚本,但出现了一个错误,python,neural-network,conv-neural-network,Python,Neural Network,Conv Neural Network,我创建了一个对视频进行分类的ConvlTM网络。该数据集由6个类组成,其中包含视频 我得到错误“NameError:name'y_pred'未定义”,它与最后第三行代码相关。您不需要运行代码,因为它可能是语法错误或类似的错误 为什么我会犯这个错误 import keras from keras import applications from keras.preprocessing.image import ImageDataGenerator from keras import optimiz

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

我得到错误“NameError:name'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))
导入keras
来自keras进口申请
从keras.preprocessing.image导入ImageDataGenerator
来自keras导入优化器
从keras.models导入顺序、模型
从keras.layers导入*
从keras.callbacks导入modelscheckpoint、LearningRateScheduler、TensorBoard、earlystoping
导入操作系统
进口cv2
将numpy作为np导入
从sklearn.model\u选择导入列车\u测试\u拆分
将keras_度量导入为km
从sklearn.metrics导入准确性\u分数
从sklearn.metrics导入精度\分数
从sklearn.metrics导入召回分数
从sklearn.metrics导入f1\U分数
从sklearn.metrics导入cohen_kappa_分数
从sklearn.metrics导入roc_auc_分数
从sklearn.metrics导入多标签矩阵
data_dir=“video_data/”
img_高度,img_宽度=64,64
序号=70
课程=[“化妆”、“射箭”、“涂口红”、“婴儿爬行”、“平衡木”、“乐队行进”]
#从视频创建帧
def帧提取(视频路径):
框架列表=[]
vidObj=cv2.视频捕获(视频路径)
#用作计数器变量
计数=1

当count时,消息中的错误是不言自明的:未定义y_pred

您必须首先预测数据,执行类似于
y\u pred=model.predict(X\u test)
的操作,然后才能
argmax
,等等

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

y_pred=model.predict(X_检验)
y_pred=np.argmax(y_pred,轴=1)
打印(分类报告(y_测试,y_预测))

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

您必须首先预测数据,执行类似于
y\u pred=model.predict(X\u test)
的操作,然后才能
argmax
,等等

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

y_pred=model.predict(X_检验)
y_pred=np.argmax(y_pred,轴=1)
打印(分类报告(y_测试,y_预测))


对于y_pred,您需要首先进行预测并将结果保存在变量中,否则,没有y_pred可执行
np.argmax(y_pred,axis=1)
我只想知道我的模型的报告。我应该如何更改代码?做一个预测。您可以从教程或文档中搜索如何做到这一点。如果你从某个地方选取了代码,你会漏掉一行。但是,每个历元都被验证为一个测试集,所以我想我已经有了我想要打印的值,存储在一些我忽略的变量中,这不是它的工作方式,这是验证,而不是保存在变量y_pred中的预测,除非您编写一个回调函数来实现这一点,并将其保存到y_pred的名为
y_pred
的变量中,否则您需要首先进行预测,并将结果保存到变量中,否则,没有y_pred可以执行
np.argmax(y_pred,axis=1)
我只想知道我模型的报告。我应该如何更改代码?做一个预测。您可以从教程或文档中搜索如何做到这一点。如果你从某个地方选取了代码,你会漏掉一行。但是,每个历元都被验证为一个测试集,所以我想我已经有了我想要打印的值,存储在一些我忽略的变量中,这不是它的工作方式,这是验证,而不是保存在变量y_pred中的预测,除非您编写一个回调函数,并将其保存到一个名为
y_pred
的变量中,否则每个历元都会被验证为一个测试集,因此我想我已经有了想要打印的值,存储在一些我忽略的变量中,我得到了与“y_test=np.argmax”相关的错误“轴1超出维度1数组的界限”(y_测试,轴=1)”。为什么?因为y_测试已经是一维的,你不需要这条线,你可以删除它这么多。为什么我们需要在y_pred上执行argmax?模型的输出是什么。预测(X_测试)?
model.predict
输出类概率。如果你做
model.predict\u classes
的话,你可以直接得到类。但是,每个历元都被验证为一个测试集,所以我想我已经有了我想要打印的值,存储在一些我忽略的变量中,我得到了错误“轴1超出维度1数组的界限”与“y_test=np.argmax(y_test,axis=1)”相关。为什么?因为y_test已经是一维的,你不需要这条线,你可以去掉它。那么,为什么我们需要在y_pred上做argmax?model.predict(X_test)的输出是什么?
model.predict
输出类概率。如果执行
model,则可以直接获取类。改为predict\u class