TypeError:Unable to serialize <tf.Variable ‘alpha:0‘ shape=() dtype=float32, numpy=0.8> to JSON.

问题描述

在使用如下代码进行模型保存时报错:

alpha = K.variable(value=0.8, dtype="float32", name="alpha") #权重
beta = K.variable(value=0.2, dtype="float32", name="beta") #权重

......

model.compile(loss='categorical_crossentropy',
              optimizer=sgd,
              loss_weights=[alpha, beta],
              metrics=['accuracy'])
model_path = "model\\model_best.h5"
model_checkpoint = ModelCheckpoint(model_path,
                                   monitor = 'loss',
                                   verbose = 1,
                                   save_best_only = True,save_weights_only=False,mode='auto',period=1)
history=model.fit_generator(
    data_generator(train_datagen,trainX,trainY,batch_size),
    epochs=50,
    validation_data=data_generator(validate_datagen,testX,testY,batch_size),
    validation_steps=total_validate//batch_size,
    steps_per_epoch=total_train//batch_size,
    callbacks=cbks,
    verbose=1,
)
model.save(model_path)#模型保存,这里报错

错误信息:
请添加图片描述


解决方案:

开始以为只需要进行类型转换就能解决,结果尝试了各种方法把代码中的alpha, beta参数转为numpy、float以及修改keras的源码都不能解决,其中转为float类型虽然在模型训练的时候不会报错,但是在模型调用的时候能看出来模型并不能正确预测,即说明模型权重等并没有完整记录。

后来偶然看到一个有人问了类似的问题,回答说这可能是tensorflow版本的问题,使用2.10版本会出现这样的问题,降为2.9.1版本即可解决。
在这里插入图片描述
而我使用的正是2.10版本的tensorflow,看到回答后立马去新建了个tensorflow2.9的环境,安装好各种包,结果还是报同样的错误。

最后突发奇想试着仅保存了模型权重,竟然就可以了!模型保存与调用都没有问题。


如果不知道如何改成仅保存权重的可以看下面的代码:

model_checkpoint = ModelCheckpoint(model_path,
                                   monitor = 'loss',
                                   verbose = 1,
                                   save_best_only = True,save_weights_only=True,mode='auto',period=1)#修改save_weights_only为True

model.save_weights(model_path)                                  

在模型调用的时候需要再写一遍模型的结构:

def build_model():
    input_ = Input(shape=(64, 64, 1))
    
    #block1
    model = Conv2D(64, (5, 5), activation ='relu', padding='same')(input_)
    model = Conv2D(64, (5, 5), activation ='relu', padding='same')(model)
    model = MaxPool2D(pool_size=(2, 2))(model)
    #block2
    model = Conv2D(128, (5, 5), activation ='relu', padding='same')(model)
    model = Conv2D(128, (5, 5), activation ='relu', padding='same')(model)
    model = MaxPool2D(pool_size=(2, 2))(model)
    #block3
    model = Conv2D(256, (5, 5), activation ='relu', padding='same')(model)
    model = Conv2D(256, (5, 5), activation ='relu', padding='same')(model)
    model = Conv2D(256, (5, 5), activation ='relu', padding='same')(model)
    model = MaxPool2D(pool_size=(2, 2))(model)
     #block4
     model = Conv2D(512, (3, 3), activation ='relu', padding='same')(model)
     model = Conv2D(512, (3, 3), activation ='relu', padding='same')(model)
     model = Conv2D(512, (3, 3), activation ='relu', padding='same')(model)
     model = MaxPool2D(pool_size=(2, 2))(model)
     #block5
     model = Conv2D(512, (3, 3), activation ='relu', padding='same')(model)
     model = Conv2D(512, (3, 3), activation ='relu', padding='same')(model)
     model = Conv2D(512, (3, 3), activation ='relu', padding='same')(model)
     model = MaxPool2D(pool_size=(2, 2))(model)
    
    # fully connected layer
    model = Flatten()(model)

    model = Dense(1024, activation='relu')(model)
    model = Dropout(0.6)(model)
    
    x1 = Dense(11, activation='softmax')(model)
    x2 = Dense(11, activation='softmax')(model)

    x = [x1, x2]

    model = Model(inputs=input_, outputs=x)
    return model

model = build_model()
model.load_weights('D:\\test\\model\\model_best.h5', by_name=False)                                 

然后就可以正常进行预测啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
这个错误通常是因为你想要将一个 TFRecordDataset 类型的值直接转换成 Tensor 类型,但是这是不支持的。TFRecordDataset 类型表示的是一个包含多个样本的数据集,而不是单个样本。你需要使用 TFRecordDataset 对象的方法,将其转换成一个可以被 TensorFlow 模型操作的 Tensor 类型。你可以使用 `map()` 方法,将每个样本转换成 TensorFlow 模型可以操作的 Tensor 类型,然后使用 `batch()` 方法将多个样本组成一个 batch。例如,假设你有一个 TFRecord 文件,其中包含了图像数据和标签,你可以这样读取和处理数据: ``` dataset = tf.data.TFRecordDataset("data.tfrecord") # 定义解析函数,将 TFRecord 中的数据解析成一个图像和一个标签 def parse_example(example_proto): features = { "image": tf.io.FixedLenFeature([], tf.string), "label": tf.io.FixedLenFeature([], tf.int64) } parsed_features = tf.io.parse_single_example(example_proto, features) image = tf.io.decode_jpeg(parsed_features["image"], channels=3) label = parsed_features["label"] return image, label # 使用 map() 方法将每个样本转换成 Tensor 类型 dataset = dataset.map(parse_example) # 使用 batch() 方法将多个样本组成一个 batch dataset = dataset.batch(batch_size) # 对数据集进行迭代 for images, labels in dataset: # 在这里对图像数据和标签进行操作 ... ``` 这样,你就可以将 TFRecord 文件中的数据读取并转换成 TensorFlow 模型可以操作的 Tensor 类型了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aaaq_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值