Python Tensorflow——;keras model.save()引发未实现错误 将tensorflow导入为tf mnist=tf.keras.datasets.mnist (x_列,y_列),(x_测试,y_测试)=列表负载数据() x_列=tf.keras.utils.normalize(x_列,轴=1) x_检验=tf.keras.utils.normalize(x_检验,轴=1) model=tf.keras.models.Sequential() 添加(tf.keras.layers.flatte()) 添加(tf.keras.layers.Dense(128,activation=tf.nn.relu)) 添加(tf.keras.layers.Dense(128,activation=tf.nn.relu)) 添加(tf.keras.layers.density(10,activation=tf.nn.softmax)) model.compile(优化器='adam', 损失=“稀疏”\u分类”\u交叉熵', 指标=[‘准确度’]) 模型拟合(x_序列,y_序列,历次=3)

Python Tensorflow——;keras model.save()引发未实现错误 将tensorflow导入为tf mnist=tf.keras.datasets.mnist (x_列,y_列),(x_测试,y_测试)=列表负载数据() x_列=tf.keras.utils.normalize(x_列,轴=1) x_检验=tf.keras.utils.normalize(x_检验,轴=1) model=tf.keras.models.Sequential() 添加(tf.keras.layers.flatte()) 添加(tf.keras.layers.Dense(128,activation=tf.nn.relu)) 添加(tf.keras.layers.Dense(128,activation=tf.nn.relu)) 添加(tf.keras.layers.density(10,activation=tf.nn.softmax)) model.compile(优化器='adam', 损失=“稀疏”\u分类”\u交叉熵', 指标=[‘准确度’]) 模型拟合(x_序列,y_序列,历次=3),python,keras,Python,Keras,当我试图保存模型时 model.save('epic\u num\u reader.model')) 我得到一个未实现的错误: NotImplementedError Traceback (most recent call last) <ipython-input-4-99efa4bdc06e> in <module>() 1 ----> 2 model.save('epic_num_reader.mode

当我试图保存模型时

model.save('epic\u num\u reader.model'))
我得到一个未实现的错误:

NotImplementedError                       Traceback (most recent call last)
<ipython-input-4-99efa4bdc06e> in <module>()
      1 
----> 2 model.save('epic_num_reader.model')

NotImplementedError: Currently `save` requires model to be a graph network. Consider using `save_weights`, in order to save the weights of the model.
NotImplementedError回溯(最近一次调用)
在()
1.
---->2 model.save('epic\u num\u reader.model'))
NotImplementedError:当前“save”要求模型为图形网络。考虑使用“SaveHuff权重”,以节省模型的权重。

那么如何保存代码中定义的模型呢?

您忘记了第一层定义中的
input\u shape
参数,这会导致模型未定义,而保存未定义的模型尚未实现,这会触发错误

model.add(tf.keras.layers.Flatten(input_shape = (my, input, shape)))
只需将
input_shape
添加到第一层,它就可以正常工作了

tf.keras.models.save_model

这里的工作(TysFoels1.12.0)(即使当输入形状未指定)

< P>对于那些还没有解决问题的人,即使按照马蒂亚斯的建议,也可以考虑使用<代码> TF.KARA.Mask.SaveEngMeod()<<代码>和<代码> LoopyMod()/<代码>。就我而言,它起作用了。

错误原因: 我得到了同样的错误,并尝试了上述答案,但得到了错误。但我找到了一个解决问题的方法,我将在下面分享:

检查在定义模型的输入层时是否传递了input_shape,如果没有传递,则在保存和加载模型时将出现错误

如何定义输入形状?

让我们考虑一下一个例子,如果你使用Mista DataSet:

mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
它由手写数字0-9的图像组成,每个数字的分辨率为28 x 28。 为此,我们可以将输入形状定义为(28,28),而不提及批次大小,如下所示:

model.add(tf.keras.layers.Flatten(input_shape=(28,28)))
通过这种方式,您可以通过查看输入训练数据集来给出输入形状

保存经过培训的模型: 现在,在训练和测试模型之后,我们可以保存我们的模型。以下代码适用于我,在重新加载模型后,它也不会改变精度:

使用save_model()

通过使用.save()

现在加载我们保存的模型: 有关更多详细信息,请参阅此链接:


导入tensorflow作为tf
将matplotlib.pyplot作为plt导入
mnist=tf.keras.datasets.mnist
(x_列,y_列),(x_测试,y_测试)=列表负载数据()
plt.imshow(x_序列[0],cmap=plt.cm.binary)
x_列=tf.keras.utils.normalize(x_列,轴=1)
x_检验=tf.keras.utils.normalize(x_检验,轴=1)
plt.imshow(x_序列[0],cmap=plt.cm.binary)
model=tf.keras.models.Sequential()
model.add(tf.keras.layers.flatte(input_shape=x_train[0].shape))
添加(tf.keras.layers.Dense(128,activation=tf.nn.relu))
添加(tf.keras.layers.Dense(128,activation=tf.nn.relu))
添加(tf.keras.layers.density(10,activation=tf.nn.softmax))
model.compile(优化器='adam',
loss='sparse\u categorical\u crossentropy',度量=['Accurance'])
模型拟合(x_序列,y_序列,历次=3)
val_损失,val_acc=模型评估(x_测试,y_测试)
打印(增值损失)
打印(val_acc)

model.save('epic_num_reader.model')
这是一个很好的答案。谢谢。我遵循相同的Sendex教程,将代码更改为
model.add(tf.keras.layers.Flatten(input_shape=x_train.shape))
buI得到
预期的flatte\u 1\u输入有4个维度,但在运行
model.fit()时得到了形状为(60000,28,28)的数组
。代码应该是什么?@hanaZ Input shape不应该包含“批处理/样本”维度,将来请记住,注释是为了澄清问题和答案,而不是介绍您自己的。@Matias。谢谢你的回复。我尝试了
model.add(tf.keras.layers.Flatten(input_shape=x_train[0].shape))
,然后它就工作了。它会工作得很好,但我发现我的模型的性能大幅下降,而且(目前无法解释)啊,我看到你也在尝试教程。很高兴看到您已经找到了解决方案
import tensorflow as tf    
tf.keras.models.save_model(
    model,
    "your_trained_model.model",
    overwrite=True,
    include_optimizer=True
) 
your_trained_model.save('your_trained_model.model')

del model  # deletes the existing model
model2 = tf.keras.models.load_model("your_trained_model.model")