![](/img/trans.png)
[英]Layer weight shape (1, 1) not compatible with provided weight shape (1,) for keras model
[英]keras shape of layer weights does not match saved weight shape
我正在尝试使用 matterport Mask R-CNN 实现来识别图像中的项目。 我使用 coco 数据集作为起点,并训练它识别 object 的其他类型。效果很好。 它能够在场景中识别出 object 类型的存在,并取得了一些成功。 我最近完成了第二批培训,现在当我尝试检查同一场景中是否存在同一项目时出现错误。
调用此代码时:
model = modellib.MaskRCNN(mode="inference", config=config, model_dir=LOGS_AND_MODEL_DIR)
weights = args["weights"] if args["weights"] \
else model.find_last()
model.load_weights(weights, by_name=True)
我的程序现在遇到以下错误:
Traceback (most recent call last):
File "mask_training.py", line 185, in <module>
model.load_weights(weights, by_name=True)
File "/usr/local/lib/python3.6/site-packages/mask_rcnn-2.1-py3.6.egg/mrcnn/model.py", line 2132, in load_weights
File "/usr/local/lib/python3.6/site-packages/keras/engine/saving.py", line 1018, in load_weights_from_hdf5_group_by_name
str(weight_values[i].shape) + '.')
ValueError: Layer #389 (named "mrcnn_bbox_fc"), weight <tf.Variable 'mrcnn_bbox_fc/kernel:0' shape=(1024, 8) dtype=float32_ref> has shape (1024, 8), but the saved weight has shape (1024, 324).
是什么导致了这个错误? 它现在才出现的事实让我怀疑我以某种方式搞砸了第二次训练过程,但我使用了与第一次训练 session 相同的过程,只是图像不同,所以这似乎不可能。 在此期间我也没有对代码进行任何重大更改。
关于第二次训练 session 的图像,我能想到的唯一可能是关闭的是并非所有图像都有 object 的实例我正在训练它识别,我只是训练它识别一种新型的 object。我还在第二次训练 session 中使用了较少的时期(总共 15 个而不是 60 个)。
如果相关,用于训练和保存层权重的大部分代码是这样的:
idxs = list(range(0, len(IMAGE_PATHS)))
random.seed(42)
random.shuffle(idxs)
i = int(len(idxs) * TRAINING_SPLIT)
trainIdxs = idxs[:i]
valIdxs = idxs[i:]
trainDataset = ImageBoundaryDataset(IMAGE_PATHS, CLASS_NAMES)
trainDataset.load_images(trainIdxs)
trainDataset.prepare()
valDataset = ImageBoundaryDataset(IMAGE_PATHS, CLASS_NAMES)
valDataset.load_images(valIdxs)
valDataset.prepare()
config = ImageBoundaryConfig()
config.display()
#image augmentation, flip or rotate image
aug = iaa.SomeOf((0, 2), [
iaa.Fliplr(0.5),
iaa.Flipud(0.5),
iaa.Affine(rotate=(-10, 10))
])
model = modellib.MaskRCNN(mode="training", config=config, model_dir=LOGS_AND_MODEL_DIR)
model.load_weights(COCO_PATH, by_name=True,
exclude=["mrcnn_class_logits", "mrcnn_bbox_fc",
"mrcnn_bbox", "mrcnn_mask"])
print("loaded weights, about to train layer heads")
#train layer heads
model.train(trainDataset, valDataset, learning_rate=config.LEARNING_RATE, epochs=5,
layers="heads",
augmentation=aug)
print("trained layer heads, about to train model")
#train all layers
model.train(trainDataset, valDataset, epochs=10, #usually 40 for serious training
layers="all", learning_rate=config.LEARNING_RATE / 10, augmentation=aug)
你应该排除一些层,如mrcnn_bbox_fc
, mrcnn_class_logits
(在load_weights
方法中填写层的名称),然后开始微调。
您可以排除这些层,而不是:
model.load_weights(CUSTOM_MODEL_PATH, by_name=True)
采用:
model.load_weights(
COCO_MODEL_PATH, by_name=True,
exclude=["mrcnn_class_logits", "mrcnn_bbox_fc", "mrcnn_bbox", "mrcnn_mask", "rpn_model"])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.