inputs = Input((IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS))
...
outputs = Conv2D(4, (1, 1), activation='sigmoid') (c9)
model = Model(inputs=[inputs], outputs=[outputs])
model.compile(optimizer='adam', loss='dice', metrics=[mean_iou])
results = model.fit(X_train, Y_train, validation_split=0.1, batch_size=8, epochs=30, class_weight=class_weights)
我有四节课很不平衡。A类为70%,B类为15%,C类为10%,D类为5%。但是,我最关心的是D类,所以我做了以下计算:
D_weight = A/D = 70/5 = 14
对于B类和A类的重量,以此类推。(如果有更好的方法来选择这些重量,请放心)
class_weights = {0: 1.0, 1: 6, 2: 7, 3: 14}
.
但是,当我这样做时,我会得到以下错误。
class_weight
我有没有可能在最后一层之后添加一个密集层,并将其用作一个虚拟层,这样我就可以通过类权重,然后只使用最后一个conv2d层的输出来进行预测?
如果这不可能,我将如何修改loss函数(我知道
post
def dice_coef(y_true, y_pred):
smooth = 1.
y_true_f = K.flatten(y_true)
y_pred_f = K.flatten(y_pred)
intersection = K.sum(y_true_f * y_pred_f)
return (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)
def bce_dice_loss(y_true, y_pred):
return 0.5 * binary_crossentropy(y_true, y_pred) - dice_coef(y_true, y_pred)
但我看不出我能用什么方法输入类权重。如果有人想要完整的工作代码,请看这个
post
. 但请记住将最后一个conv2d层的num类更改为4,而不是1。