Python 我为视频分类编写了一个简单的convLSTM脚本,但出现了一个错误
我创建了一个对视频进行分类的ConvlTM网络。该数据集由6个类组成,其中包含视频 我得到错误“NameError:name'y_pred'未定义”,它与最后第三行代码相关。您不需要运行代码,因为它可能是语法错误或类似的错误 为什么我会犯这个错误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
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