【发布时间】:2020-10-28 19:05:46
【问题描述】:
我想运行/拟合一个模型,保存它然后加载它。我想利用SavedModel 格式并保存整个模型并为此提供解决方案。这不是 HDF5 格式,所以不是 .h5 格式,但事实证明即使使用 .h5 它也不起作用(请参阅下面的答案/评论)。我在 Colab 工作。我的代码如下:
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import os
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.python.keras.utils.version_utils import training
from tensorflow.keras.optimizers import RMSprop
_URL = 'https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip'
path_to_zip = tf.keras.utils.get_file('cats_and_dogs.zip', origin=_URL, extract=True, cache_subdir = '/tmp/catsdogs')
PATH = os.path.join(os.path.dirname(path_to_zip), 'cats_and_dogs_filtered')
training_dir = os.path.join(PATH, 'train')
validation_dir = os.path.join(PATH, 'validation')
train_image_generator = ImageDataGenerator(rescale=1./255)
validation_image_generator = ImageDataGenerator(rescale=1./255)
train_datagen = train_image_generator.flow_from_directory(
directory=training_dir,
target_size=(300, 300),
shuffle=True,
batch_size=128,
class_mode='binary'
)
val_datagen = validation_image_generator.flow_from_directory(
directory=validation_dir,
target_size=(300, 300),
batch_size=128,
class_mode='binary'
)
model = Sequential([
Conv2D(16, 3, padding = 'same', activation='relu', input_shape=(300, 300 ,3)),
MaxPooling2D(),
Conv2D(32, 3, padding = 'same', activation='relu'),
MaxPooling2D(),
Conv2D(64, 3, padding = 'same', activation='relu'),
MaxPooling2D(),
Dropout(0.2),
Flatten(),
Dense(512, activation='relu'),
Dense(1)
])
model.compile(optimizer='Adam', loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=['acc'])
model.summary()
history = model.fit(train_datagen,validation_data=val_datagen,epochs=1)
现在我想保存这个模型并加载它:
model.save('saved_model')
from keras.models import load_model
modeldownload = load_model('saved_model')
但是,这不起作用(同样的问题,当我将from keras-models import load_model 直接放在其他导入所在的开头时)。我收到以下错误消息:
OSError: Unable to open file
全文:
---------------------------------------------------------------------------
OSError Traceback (most recent call last)
<ipython-input-24-1b29d8169144> in <module>()
1 model.save('saved_model')
----> 2 modeldownload = load_model('saved_model')
4 frames
/usr/local/lib/python3.6/dist-packages/h5py/_hl/files.py in make_fid(name, mode, userblock_size, fapl, fcpl, swmr)
171 if swmr and swmr_support:
172 flags |= h5f.ACC_SWMR_READ
--> 173 fid = h5f.open(name, flags, fapl=fapl)
174 elif mode == 'r+':
175 fid = h5f.open(name, h5f.ACC_RDWR, fapl=fapl)
h5py/_objects.pyx in h5py._objects.with_phil.wrapper()
h5py/_objects.pyx in h5py._objects.with_phil.wrapper()
h5py/h5f.pyx in h5py.h5f.open()
OSError: Unable to open file (file read failed: time = Wed Jul 8 11:17:03 2020
, filename = 'saved_model', file descriptor = 62, errno = 21, error message = 'Is a directory', buf = 0x7fff87aca540, total read size = 8, bytes this sub-read = 8, bytes actually read = 18446744073709551615, offset = 0)
我试着和我们一起玩,使用不同的文件夹、子目录等等。但我没有让它工作。如何正确执行?我也试过model.fit(train_datagen,validation_data=val_datagen,epochs=1),所以没有history =,但同样的错误信息。
【问题讨论】:
-
您正在使用 tf.keras 保存模型,然后使用 keras 加载它,这不是同一个库,所以这不起作用,为此您需要使用 tf.keras.models .load_model
标签: python tensorflow keras google-colaboratory