Keras.model.save() 引发 NotImplementedError 如何解决

「机器学习入坑指南(九):TensorFlow 实战——手写数字识别(MNIST 数据集)」一文中,我们实现了一个模型,完整的代码如下(原文有详细解析):

import tensorflow as tf  

mnist = tf.keras.datasets.mnist  
(x_train, y_train),(x_test, y_test) = mnist.load_data()  

x_train = tf.keras.utils.normalize(x_train, axis=1) 
x_test = tf.keras.utils.normalize(x_test, axis=1)  

model = tf.keras.models.Sequential()  
model.add(tf.keras.layers.Flatten())  # 把图片展平成 1x784,这里应该指定 shape 
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))  
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu)) 
model.add(tf.keras.layers.Dense(10, activation=tf.nn.softmax))  

model.compile(optimizer='adam',  
              loss='sparse_categorical_crossentropy',  
              metrics=['accuracy'])  

model.fit(x_train, y_train, epochs=3)  

val_loss, val_acc = model.evaluate(x_test, y_test)  
print(val_loss)  
print(val_acc)  

如果我们想保存这个模型,可以使用如下代码

model.save('epic_num_reader.model')

然后就会不幸地引发 NotImplementedError
DQ1iWtq.jpg
为了解决这个问题折腾了半天,后来在 Stack Overflow 上提问,大神告诉我是因为我没有给第一层设置 input_shape 参数,导致模型没有明确的定义,而 Keras 并没有实现保存未定义的模型的方法,从而引发了这个错误。

于是,把添加第一层的代码改为

model.add(tf.keras.layers.Flatten(input_shape=(28,28))) #因为输入的是 28x28 的图像(矩阵)

再次保存模型,就不会报错啦!

欢迎访问 Evan 的博客

转载于:https://www.cnblogs.com/Evan-Gao/p/9726743.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
--------------------------------------------------------------------------- OSError Traceback (most recent call last) <ipython-input-41-76f2930386d7> in <module>() ----> 1 model.save('CNN_CIFAR10_model_h5') D:\360downloads\Anaconda\envs\tensorflow_cpu\lib\site-packages\keras\engine\network.py in save(self, filepath, overwrite, include_optimizer) 1088 raise NotImplementedError 1089 from ..models import save_model -> 1090 save_model(self, filepath, overwrite, include_optimizer) 1091 1092 def save_weights(self, filepath, overwrite=True): D:\360downloads\Anaconda\envs\tensorflow_cpu\lib\site-packages\keras\engine\saving.py in save_model(model, filepath, overwrite, include_optimizer) 377 opened_new_file = False 378 --> 379 f = h5dict(filepath, mode='w') 380 381 try: D:\360downloads\Anaconda\envs\tensorflow_cpu\lib\site-packages\keras\utils\io_utils.py in __init__(self, path, mode) 184 self._is_file = False 185 elif isinstance(path, str): --> 186 self.data = h5py.File(path, mode=mode) 187 self._is_file = True 188 elif isinstance(path, dict): D:\360downloads\Anaconda\envs\tensorflow_cpu\lib\site-packages\h5py\_hl\files.py in __init__(self, name, mode, driver, libver, userblock_size, swmr, rdcc_nslots, rdcc_nbytes, rdcc_w0, track_order, **kwds) 406 fid = make_fid(name, mode, userblock_size, 407 fapl, fcpl=make_fcpl(track_order=track_order), --> 408 swmr=swmr) 409 410 if isinstance(libver, tuple): D:\360downloads\Anaconda\envs\tensorflow_cpu\lib\site-packages\h5py\_hl\files.py in make_fid(name, mode, userblock_size, fapl, fcpl, swmr) 177 fid = h5f.create(name, h5f.ACC_EXCL, fapl=fapl, fcpl=fcpl) 178 elif mode == 'w': --> 179 fid = h5f.create(name, h5f.ACC_TRUNC, fapl=fapl, fcpl=fcpl) 180 elif mode == 'a': 181 # Open in append mode (read/write). h5py\_objects.pyx in h5py._objects.with_phil.wrapper() h5py\_objects.pyx in h5py._objects.with_phil.wrapper() h5py\h5f.pyx in h5py.h5f.create() OSError: Unable to create file (unable to truncate a file which is already open)
07-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值