#tensorflow #keras
#tensorflow #keras
Вопрос:
Я хочу сохранить свою обученную модель keras в виде .h5
файла. Должно быть прямолинейно. Короткий пример:
#%%
import tensorflow as tf
import numpy as np
from tensorflow.keras.callbacks import ModelCheckpoint
import matplotlib.pyplot as plt
print('TF version: ',tf.__version__)
#%%
#########################
# BATCH SIZE
BATCH_SIZE=100
########################
# create training data
X_train_set = np.random.random(size=(10000,10))
y_train_set = np.random.random(size=(10000))
# create validation data
X_val_set = np.random.random(size=(100,10))
y_val_set = np.random.random(size=(100))
# convert np.array to dataset
train_dataset = tf.data.Dataset.from_tensor_slices((X_train_set, y_train_set))
val_dataset = tf.data.Dataset.from_tensor_slices((X_val_set, y_val_set))
# batching
train_dataset=train_dataset.batch(BATCH_SIZE)
val_dataset = val_dataset.batch(BATCH_SIZE)
# set up the model
my_model = tf.keras.Sequential([
tf.keras.layers.Input(shape=(10,)),
tf.keras.layers.Dense(100, activation='relu'),
tf.keras.layers.Dense(10, activation='relu'),
tf.keras.layers.Dense(1)
])
#%%
# custom optimizer with learning rate
lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(
initial_learning_rate=1e-2,
decay_steps=10000,
decay_rate=0.9)
optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule)
# compile the model
my_model.compile(optimizer=optimizer,loss='mse')
# define a checkpoint
checkpoint = ModelCheckpoint('./tf.keras_test',
monitor='val_loss',
verbose=1,
save_best_only=True,
mode='min',
save_freq='epoch')
callbacks = [checkpoint]
#%%
# train with datasets
history= my_model.fit(train_dataset,
validation_data=val_dataset,
#validation_steps=100,
#callbacks=callbacks,
epochs=10)
# save as .h5
my_model.save('my_model.h5',save_format='h5')
Однако, my_model.save
дает мне TypeError
:
Traceback (most recent call last):
File "/home/max/.local/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 3343, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-11-a369340a62e1>", line 1, in <module>
my_model.save('my_model.h5',save_format='h5')
File "/home/max/.local/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/network.py", line 975, in save
signatures, options)
File "/home/max/.local/lib/python3.6/site-packages/tensorflow_core/python/keras/saving/save.py", line 112, in save_model
model, filepath, overwrite, include_optimizer)
File "/home/max/.local/lib/python3.6/site-packages/tensorflow_core/python/keras/saving/hdf5_format.py", line 109, in save_model_to_hdf5
save_weights_to_hdf5_group(model_weights_group, model_layers)
File "/home/max/.local/lib/python3.6/site-packages/tensorflow_core/python/keras/saving/hdf5_format.py", line 631, in save_weights_to_hdf5_group
param_dset = g.create_dataset(name, val.shape, dtype=val.dtype)
File "/usr/local/lib/python3.6/dist-packages/h5py/_hl/group.py", line 143, in create_dataset
if '/' in name:
TypeError: a bytes-like object is required, not 'str'
Не уверен, в чем проблема… Это проблема TF2? Никогда не было проблем с сохранением как .h5
с TF1.X и все еще может сохранить его как .pb
график. Тем не менее, я бы хотел, чтобы она была такой .h5
.
Ответ №1:
Похоже, это ошибка в библиотеке h5py, она должна принимать bytes
или юникод str
, но не работает с str
экземпляром. Это должно быть исправлено в следующем выпуске.
Вы можете понизить h5py
версию в своей локальной установке, и это должно решить проблему. Проблема была введена в версии 3.0.0, поэтому более ранние версии должны работать.
Комментарии:
1. Танки, это была моя проблема. Я установил h5py> 3, затем я понизил рейтинг до версии 2.10.0