我训练了一个数字图像并制作了一个模型文件。
相应的酱料如下。
import os
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import load_model
import cv2
from sklearn.model_selection import train_test_split
from tensorflow.keras.layers import Flatten, Convolution2D, MaxPooling2D
from tensorflow.keras.layers import Dropout, Activation, Dense
from tensorflow.keras.layers import Conv2D
os.environ['TF_XLA_FLAGS'] = '--tf_xla_enable_xla_devices'
path = '/Users/animalman/Documents/test/cnn/'
trainPath = os.listdir(path+'train')
testPath = os.listdir(path+'test')
categories = ["5"]
length = len(categories)
width = 28
height = 28
label = [1 for i in range(length)]
X = []
Y = []
for idx, categorie in enumerate(categories):
label = [0 for i in range(length)]
label[idx] = 1
fileDir = path + 'train' + '/' + categorie + '/'
for t, dir, f in os.walk(fileDir):
for filename in f:
print(fileDir + filename)
img = cv2.imread(fileDir + filename)
img = cv2.resize(img, None, fx=width/img.shape[0],fy=height/img.shape[1])
X.append(img)
Y.append(label)
X = np.array(X)
Y = np.array(Y)
X_train, X_test,Y_train, Y_test = train_test_split(X,Y)
xy = (X_train, X_test, Y_train, Y_test)
X_train = X_train.astype("float") / 256
X_test = X_test.astype("float") / 256
model = Sequential()
model.add(Conv2D(16, (3, 3), input_shape=X_train.shape[1:], padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(length))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
hdf5_file = "./7obj-model.h5"
if os.path.exists(hdf5_file):
model.load_weights(hdf5_file)
else:
model.fit(X_train, Y_train, batch_size=32, epochs=1)
model.save_weights(hdf5_file)
然后我把保存的模型文件带进来。
loaded_model = tf.keras.models.load_model(hdf5_file)
然而,这就是错误发生的地方。原因是什么?
Traceback(最近一次调用):文件/Users/animalman/Documents/test/train.py"第112行loadd_model = tf.keras.models.load_model(hdf5_file) File "/Users/animalman/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/saving/save.py"第206行,在load_modelhdf5_format返回。load_model_from_hdf5(文件路径,custom_objects,文件"/用户/animalman/opt/anaconda3/lib/python3.8/网站/tensorflow/python/keras/保存/hdf5_format.py",第181行,在load_model_from_hdf5中抛出ValueError('No model found in config file.') ValueError: No model found in config file.
如本文所述,您的h5
文件仅包含权重。您需要将模型架构保存在json文件中,然后使用model_from_json
来加载模型配置,因此,您可以使用load_weights
加载权重。
另一个选择可能是通过将最后一行替换为
来简单地保存您的模型(架构+权重)model.save("model.h5")
然后加载,你可以使用
model = load_model('model.h5')
添加到@Oscar响应,对于较小和简单的模型,'h5'
格式是足够的,但对于具有custom_layers或自定义度量的复杂模型(Functional和子类化),最好保存为'tf'
格式(也称为SavedModel格式)
点击这里查看Keras网页上更详细的指南
Keras SavedModel格式限制:
由SavedModel完成的跟踪,以生成层调用的图形函数允许SavedModel比H5更具可移植性,但它来了与缺点。
可能比H5更慢、更笨重。无法序列化生成的操作从mask参数(即,如果用layer(…)调用一个图层,mask=mask_value),则mask参数不会保存到SavedModel)。做不要在子类模型中保存重写的train_step()。自定义使用遮罩或有自定义训练循环的对象仍然可以从SavedModel中保存和加载,除非它们必须重写Get_config ()/from_config(),类必须传递给
H5限制:
外部损耗&通过model.add_loss() &model.add_metric()不被保存(不像SavedModel)。如果有的话的损失,你的模型的指标,你想继续训练,你需要在加载模型后自己添加这些损失。请注意这并不适用于损失/参数创建内部层通过self.add_loss (),self.add_metric()。只要层被加载,这些损失& &;度量被保留,因为它们是调用的一部分层的方法。的自定义对象的计算图自定义图层不包含在保存的文件中。在装载时,Keras需要访问它们的Python类/函数对象,以便重建模型。参见自定义对象。做不支持预处理层。