【问题标题】:Keras gives 'Not JSON Serializable' error when saving the modelKeras 在保存模型时出现“Not JSON Serializable”错误
【发布时间】:2019-08-29 15:17:31
【问题描述】:

我正在使用此处定义的 unet 实现一个用于图像分割的完全卷积神经网络

https://github.com/zhixuhao

为了给不同类的像素赋予不同的权重,我定义了一个额外的 Lambda 层,如此处所建议的

Keras, binary segmentation, add weight to loss function

问题是Keras在保存模型的时候会报这个错误

.....
self.model.save(filepath, overwrite=True)
.....
TypeError: ('Not JSON Serializable:', b'\n\x15clip_by_value/Minimum\x12\x07Minimum\x1a\x12conv2d_23/Identity\x1a\x17clip_by_value/Minimum/y*\x07\n\x01T\x12\x020\x01')

我的网络是在外部函数中定义的

def weighted_binary_loss(X):
    y_pred, y_true, weights = X
    loss = binary_crossentropy(y_true, y_pred)
    weights_mask = y_true*weights[0] + (1.-y_true)*weights[1]
    loss = multiply([loss, weights_mask])
    return loss    

def identity_loss(y_true, y_pred):
    return y_pred


def net()
.....
....
conv10 = Conv2D(1, 1, activation = 'sigmoid')(conv9)
w_loss = Lambda(weighted_binary_loss, output_shape=input_size, name='loss_output')([conv10, inputs, weights])
model = Model(inputs = inputs, outputs = w_loss)
model.compile(optimizer = Adam(lr = 1e-5), loss = identity_loss, metrics = ['accuracy'])

我在主函数中调用

...
model_checkpoint = ModelCheckpoint('temp_model.hdf5', monitor='loss',verbose=1, save_best_only=True)
model.fit_generator(imgs,steps_per_epoch=20,epochs=1,callbacks=[model_checkpoint])

当我擦除 Lambda 层时,错误消失了

...
conv10 = Conv2D(1, 1, activation = 'sigmoid')(conv9)
model = Model(inputs = inputs, outputs = conv10)
model.compile(optimizer = Adam(lr = 1e-5), loss = 'binary_crossentropy', metrics = ['accuracy'])

我正在使用 Keras==2.2.4, tensorflow-gpu==2.0.0b1

【问题讨论】:

    标签: tensorflow keras conv-neural-network image-segmentation


    【解决方案1】:

    您似乎正在计算模型层中的损失。将损失函数作为一个层来容纳不是一个好习惯。您可以使用自定义损失函数计算加权损失。

    所以你的代码可以改写如下:

    def weighted_binary_loss(y_true, y_pred):
        weights = [0.5, 0.6]  # Define your weights here
        loss = binary_crossentropy(y_true, y_pred)
        weights_mask = y_true*weights[0] + (1.-y_true)*weights[1]
        loss = multiply([loss, weights_mask])
        return loss  
    
    conv10 = Conv2D(1, 1, activation = 'sigmoid')(conv9)
    model = Model(inputs = inputs, outputs = conv10)
    model.compile(optimizer = Adam(lr = 1e-5), loss = weighted_binary_loss, metrics = ['accuracy'])
    

    如果需要weights 是动态属性,并且您必须将其作为损失函数中的单独参数发送,您可以按照此question。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多