当我下载resnet模型的dataset时,数据文件显示了33个培训类和6个验证类。但是当我编译它时,它会报告类号是错误的。类似于以下代码:
resnet_model = Sequential()
pretrained_model = tf.keras.applications.ResNet50(include_top=False,
input_shape=(224,224,3),
pooling='avg',
classes = 33,
weights = 'imagenet')
for layer in pretrained_model.layers:
layer.trainable=False
resnet_model.add(pretrained_model)
resnet_model.add(Flatten())
#resnet_model.add(Dense(512,activation='relu'))
resnet_model.add(Dense(33,activation='softmax'))
resnet_model.compile(optimizer=Adam(learning_rate=0.001),loss='categorical_crossentropy',metrics=['accuracy'])
epochs = 3
history= resnet_model.fit(
trains_ds,
validation_data=val_ds,
epochs=epochs)
错误显示:形状(无,33)和(无,6)不兼容。
是否必须有相同的培训数据集和验证数据集的类号?如果我有33个类用于培训,6个类用于验证,我需要为验证数据集再创建27个类图片。那我就可以装了,对吗?
发布于 2022-08-03 05:35:04
是的,你必须拥有相同的“类数”,或者更恰当地说,标签的一次热编码必须具有相同的形状。在这种情况下,(None, 33)
。
为了理解为什么,让我们稍微偏离一点-热编码。这是一个将分类变量(您的标签0, 1, 2, ..., 32
)转换成另一种形式的过程,更适合于ML算法。
示例:为了简单起见,让我们假设您只有4个类。您的数据集可能有以下标签:0, 1, 2, 3
。使用一次热编码,它被创建为除1以外的所有零的形状4的向量,这样它就可以对标签进行编码。在这种情况下:
0 -> [1 0 0 0]
1 -> [0 1 0 0]
2 -> [0 0 1 0]
3 -> [0 0 0 1]
现在让我们回到你的案子。由于网络实质上无法处理不同的形状,所以网络会正确地产生错误。然而,也有一个逻辑的原因,这是不允许的。含糊不清如果我们编码一个标签,例如标签2在33个类或6个类上进行一次热编码,矢量就会发生变化。但是,网络如何能够匹配这两个向量呢?你怎么知道你指的是同一个班?
还有另一个需要考虑的方面,为什么要在一组减少的课程中验证您的培训?验证的目的是监视您的培训在不影响培训的一组不同图像上的性能。但是,如果您使用一组狭窄的类来训练类,那么最终您将只验证该子集,而完全忽略了其他部分。
所以,要回答这个问题,你可以用你目前的图像进行验证,修改一次热编码,使其与火车的形状相同,但这没有多大意义。建议引入来自所有类的图像。
https://stackoverflow.com/questions/73216253
复制相似问题