【发布时间】:2019-02-26 12:15:59
【问题描述】:
我有一个包含 460 张图像的 15 类数据集。我想将每 8 个图像序列同时输入到相同的 CNN 结构中。我使用 conv3d 来做到这一点,但我对输入形状感到困惑,它返回错误。 这是我的模型:
IMAGE_DIMS = (8, 460, 60, 60, 3)
data = []
labels = []
# loading images...
imagePaths = "dataset\\path"
listing = os.listdir(imagePaths)
for imagePath in listing:
image_fold = os.listdir(imagePaths + "\\" + imagePath)
for file in image_fold:
im = (imagePaths + "\\" + imagePath + "\\" + file)
image = cv2.imread(im)
image = cv2.resize(image, (IMAGE_DIMS[2], IMAGE_DIMS[3]))
image = img_to_array(image)
data.append(image)
label= imagePath.split(os.path.sep)[-1]
labels.append(label)
# scale the raw pixel intensities to the range [0, 1]
data = np.array(data, dtype="float") / 255.0
labels = np.array(labels)
# binarize the labels
lb = LabelBinarizer()
labels = lb.fit_transform(labels)
(trainX, testX, trainY, testY) = train_test_split(data, labels, test_size=0.2, random_state=42)
model = Sequential()
sample= IMAGE_DIMS[0]
frame=IMAGE_DIMS[1]
height = IMAGE_DIMS[2]
width=IMAGE_DIMS[3]
channels=IMAGE_DIMS[4]
classes=len(lb.classes_)
inputShape = (sample, frame, height, width, channels)
chanDim = -1
if K.image_data_format() == "channels_first":
inputShape = (sample, frame, channels, height, width)
chanDim = 1
model.add(Conv3D(32, (3, 3, 3), padding="same", batch_input_shape=inputShape))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling3D(pool_size=(2, 2, 2), padding="same", data_format="channels_last"))
model.add(Dropout(0.25))
model.add(Conv3D(64, (3, 3, 3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling3D(pool_size=(2, 2, 2), padding="same", data_format="channels_last"))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128))
model.add(Activation("relu"))
model.add(BatchNormalization())
model.add(Dropout(0.5))
# softmax classifier
model.add(Dense(classes))
model.add(Activation("softmax"))
model.summary()
opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS)
model.compile(loss="categorical_crossentropy", optimizer= opt, metrics=["accuracy"])
H = model.fit(trainX, trainY, batch_size=BS, epochs=EPOCHS, verbose=1,validation_data (testX,testY))
但我收到以下错误:
ValueError: Error when checking input: expected conv3d_1_input to have 5 dimensions, but got array with shape (368, 60, 60, 3)
我该如何解决这个错误,任何人都可以帮助我,我将感谢任何帮助。我知道输入形状的问题,编译器参考model.fit 步骤。我认为 trainX、testX、trainY、testY 必须是 5-dim,但我做不到。
【问题讨论】:
-
根据tensorflow站点,
conv3d层的输入应该是[batch, in_depth, in_height, in_width, in_channels]的格式。批处理是batch_size,in_depth应该是no_of_images_at_a_time,在你的情况下是8,in_height和in_width是60和60,in_channels是3。我可以看到这个in_depth尺寸不存在,batch_size相当大。这可能会导致问题吗?如果您不使用inputShape提供图像,那么使用batch_input_shape=inputShape是没有意义的。 -
@avin 谢谢你的回复。是的,我照你说的做。 h、w、ch 分别为 60、60、3。深度是8。但我不知道什么是批处理?因为我知道批次无法填充,keras已经知道了,所以我必须输入4D张量,而keras将其视为5D。但是它给了我一个错误,它期望有 5D 张量,当我将所有数据集图像的编号作为附加代码放置时,它也会给我关于 conv3d 的预期维度的错误。它指的是 (model.fit) 行,我想火车和测试数据的问题,它们必须是 5d 数组。你能帮我做点什么吗?
标签: python keras deep-learning conv-neural-network