ValueError:找到暗淡为 3 的数组。预计估计器 <= 2。(Keras,Sklearn)
Posted
技术标签:
【中文标题】ValueError:找到暗淡为 3 的数组。预计估计器 <= 2。(Keras,Sklearn)【英文标题】:ValueError: Found array with dim 3. Estimator expected <= 2. ( Keras, Sklearn) 【发布时间】:2020-07-10 06:54:28 【问题描述】:我正在尝试使用 Adrian Rosebrock 教程中的这段代码训练模型,使用我的自定义数据集来检测面部表情。
INIT_LR = 1e-3
EPOCHS = 30
BS = 10
print("[INFO] loading images...")
imagePaths = list(paths.list_images(args["dataset"]))
data = []
labels = []
for imagePath in imagePaths:
# extract the class label from the filename
label = imagePath.split(os.path.sep)[-2]
image = cv2.imread(imagePath)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = cv2.resize(image, (48, 48))
data.append(image)
labels.append(label)
data = np.array(data) / 255.0
labels = np.array(labels)
# perform one-hot encoding on the labels
lb = LabelBinarizer()
labels = lb.fit_transform(labels)
labels = to_categorical(labels)
(trainX, testX, trainY, testY) = train_test_split(data, labels,
test_size=0.20, stratify=labels, random_state=42) # line 80
trainAug = ImageDataGenerator(
rotation_range=15,
fill_mode="nearest")
baseModel = VGG16(weights="imagenet", include_top=False,
input_tensor=Input(shape=(48, 48, 3)))
headModel = baseModel.output
headModel = AveragePooling2D(pool_size=(4, 4))(headModel)
headModel = Flatten(name="flatten")(headModel)
headModel = Dense(64, activation="relu")(headModel)
headModel = Dropout(0.5)(headModel)
headModel = Dense(7, activation="softmax")(headModel)
model = Model(inputs=baseModel.input, outputs=headModel)
for layer in baseModel.layers:
layer.trainable = False
print("[INFO] compiling model...")
opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS)
model.compile(loss="categorical_crossentropy", optimizer=opt,
metrics=["accuracy"])
print("[INFO] training head...")
H = model.fit_generator(
trainAug.flow(trainX, trainY, batch_size=BS),
steps_per_epoch=len(trainX) // BS,
validation_data=(testX, testY),
validation_steps=len(testX) // BS,
epochs=EPOCHS) # InvalidArgumentError : Incompatible shapes
此代码适用于两个类(二进制分类)。 我想让这个脚本训练一个包含 7 个类的数据集。 我做了一些更改,但是当我执行这段代码时,我得到了这个错误:
[INFO] 正在加载图片...
Traceback(最近一次调用最后一次):
文件“train_mask.py”,第 80 行,在
test_size=0.20,stratify=labels,random_state=42),在 check_array 中
% (array.ndim, estimator_name))
ValueError: 找到暗淡为 3 的数组。预计估计器
我应该怎么做才能使这段代码适用于多标签分类,而不是二元分类?
【问题讨论】:
data
的形状是什么?
维度为(48,48)
不是维度,image.shape
,我猜是(48, 48, 3)
,因为它是RGB
图像,对吧?
是的,是吗,我的意思是(48, 48, 3)
执行to_categorical(labels)
后labels
的形状是什么?另外,请修复图像路径循环上的缩进
【参考方案1】:
通常,stratify 参数采用一个层或标签数组,而不是单热编码标签。
如果您删除分层,它会运行吗?如果是这样,只需删除创建一个变量,如 hotlabels,这样您就不会覆盖原始标签数组。
这取决于您使用的 train_test_split 函数。如果是 scikit,它应该是一个标签数组。
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html
【讨论】:
谢谢,这个解决方案现在对我有用,但我现在遇到了其他错误 tensorflow.python.framework.errors_impl.InvalidArgumentError: 不兼容的形状:[10,7] vs. [10] [[ node metrics/acc/Equal]] [[node ConstantFoldingCtrl/loss/dense_1_loss/broadcast_weights/assert_broadcastable/AssertGuard/Switch_0]] 不是,标签的形状是(981, 7, 2)
这是在编译还是拟合阶段?这不是在您上面发布的代码之后吗?
是的,我已经更新了我的代码,并在导致错误的行中添加了注释。
你应该可以在热编码之前用stratifylabels = np.array(labels)
再次放入分层。然后将其用作分层参数。虽然如果你的 emojii 面部表情已经非常具有代表性,那么它不应该那么重要。以上是关于ValueError:找到暗淡为 3 的数组。预计估计器 <= 2。(Keras,Sklearn)的主要内容,如果未能解决你的问题,请参考以下文章
ValueError:找到暗淡3的数组。估计器预期<= 2。使用numpy数组时
ValueError:找到暗淡 3 的数组。估计器预期 <= 2。>>>
运行以下代码时出现错误(找到暗淡 3 的数组。预计估计器 <= 2)