python - 如何在 RNN 模型中使用图像集
问题描述
您好,我正在尝试使用 Keras 和 Tensorflow 进行我的第一个 RNN,但我遇到了一个问题,或者正在重塑我的图像以适应模型。
我看过这篇文章,但无法弄清楚重塑:
我拥有的是在视频中的每一帧拍摄的一堆图像。我将所有帧都保存在 python 之外,所以我有一个非常大的图像文件夹。我将帧分成 21 个帧作为一个片段,因此每个动作我想要捕获 21 个图像。我想将这 21 张图像作为一个序列读取。在这个模型中,我从多个相机/角度捕捉到了相同的序列。我想尝试的是对一个动作进行建模,看看一个人是否在做这个动作,所以它基本上是一个二元模型是或否。不是最复杂的,但它是使用这个模型和 keras 的一个学习过程。
我需要帮助弄清楚如何在 keras 模型中使用这些图像。我看过一些关于 MINST 数据集的教程,但这并没有帮助我解决这个问题。任何帮助将不胜感激。
这是我尝试训练模型时出现的错误
ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (2026, 200, 200, 1)
我的代码是这样的:
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.layers import LSTM
from tqdm import tqdm
import cv2
import os
import numpy as np
imageSize = 200
#create lables for each image
def labelImage(img):
wordLabel = img.split('.')[-3]
#Conversion to one hot array [lat,not]
if wordLabel == "FWAC":
return[1,0]
else:
return[0,1]
#Process images and add lables
#Convert data into an array and add its lable
def makeTrainingData():
print("Creating Training Data")
trainingData = []
for img in tqdm(os.listdir(trainDir)):
label = labelImage(img)
path = os.path.join(trainDir,img)
img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (imageSize,imageSize))
trainingData.append([np.array(img),np.array(label)])
#Save the array file to load it into other models if needed
np.save("trainingData.npy", trainingData)
print("Training Data Saved")
return trainingData
#process the testing data in the same manner
def processTestData():
print("Creating Testing Data")
testData = []
for img in tqdm(os.listdir(testDri)):
print("image", img)
path = os.path.join(testDri, img)
imgNum = img.split(".")[0]
img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (imageSize, imageSize))
testData.append([np.array(img), imgNum])
np.save("testingData.npy", testData)
print("Testing Data Saved")
return testData
rnnSize = 512
model = Sequential()
model.add(LSTM(rnnSize, input_shape=(imageSize, imageSize)))
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dense(50))
model.add(Activation('sigmoid'))
model.add(Dense(3))
model.add(Activation('softmax'))
model.compile(loss='mean_squared_error', optimizer='adam',metrics=['accuracy'])
#Data
trainDir = "D:/TrainingDataSets/TrainingSet/"
testDri = "D:/TrainingDataSets/TestingSet/"
#trainData = makeTrainingData()
#testData = processTestData()
trainData = np.load('trainingData.npy')
testData = np.load("testingData.npy")
#resize the image to this See above
train = trainData[:-500]
test = trainData[-200:]
x = []
y = []
for xi in trainData:
x.append(xi[0].reshape((-1, imageSize, imageSize)))
y.append(xi[1])
x_train = np.array([i[0] for i in train]).reshape(-1,imageSize, imageSize,1)
y_train = [i[1] for i in train]
test_x = np.array([i[0] for i in test]).reshape(-1,imageSize , imageSize,1)
test_y = [i[1] for i in test]
epoch = 5
batchSize = 100
model.fit(x_train, y_train, epochs=epoch, batch_size= batchSize, verbose=1, shuffle=False)
解决方案
对于密集层之前的错误,请添加以下行:
model.add(Flatten())
以前,您应该导入:
from keras.layers import Flatten
推荐阅读
- networking - 新的 Lamp Stack 部署网络接口不起作用
- amazon-s3 - 从 S3 复制数据时尝试映射列出现错误 SQL 编译错误:在“s3:bucket/file.csv.gz”中找到无效的 URL 前缀
- powershell - Powershell上的7zip命令无法解析?
- javascript - 如何在 react-native 中使用 i18n-js 将组件渲染为参数?
- docker - Kubernetes Pod 无法启动 - Google Composer
- php - PHP require 不起作用,没有任何错误
- spring - Cron 表达式在 Spring Boot 应用程序中未按预期工作
- ipsec - 配置 Strongswan 以通过一个连接创建多个子 SA/SPI?
- tmap - 为什么不是所有的点都出现在使用 tmap 创建的地图上?
- string - vb.net 如何将字符串“one”转换为整数 1