Как загрузить и использовать веса сохраненной модели?
Проблема заключается в том, что я без понятия, как загрузить веса сохраненной модели и использовать их. Читал документацию, но ни один из способов не подошел. Буду благодарен за помощь.
import os
import keras
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
import numpy as np
from tensorflow.keras.layers import Dense
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
class DenseNN(tf.Module):
def __init__(self, outputs, activate="relu"):
super().__init__()
self.outputs = outputs
self.activate = activate
self.fl_init = False
def __call__(self, x):
if not self.fl_init:
self.w = tf.random.truncated_normal((x.shape[-1], self.outputs), stddev=0.1, name="w")
self.b = tf.zeros([self.outputs], dtype=tf.float32, name="b")
self.w = tf.Variable(self.w)
self.b = tf.Variable(self.b)
self.fl_init = True
y = x @ self.w + self.b
if self.activate == "relu":
return tf.nn.relu(y)
elif self.activate == "softmax":
return tf.nn.softmax(y)
return y
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train / 255
x_test = x_test / 255
x_train = tf.reshape(tf.cast(x_train, tf.float32), [-1, 28 * 28])
x_test = tf.reshape(tf.cast(x_test, tf.float32), [-1, 28 * 28])
y_train = to_categorical(y_train, 10)
layer_1 = DenseNN(128)
layer_2 = DenseNN(10, activate="softmax")
model = keras.Sequential()
model.add(layer_1)
model.add(layer_2)
def model_predict(x):
y = layer_1(x)
y = layer_2(y)
return y # layer_2(layer_1(x))
cross_entropy = lambda y_true, y_pred: tf.reduce_mean(tf.losses.categorical_crossentropy(y_true, y_pred))
opt = tf.optimizers.Adam(learning_rate=0.001)
BATCH_SIZE = 32
EPOCHS = 10
TOTAL = x_train.shape[0]
train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_dataset = train_dataset.shuffle(buffer_size=1024).batch(BATCH_SIZE)
for n in range(EPOCHS):
loss = 0
for x_batch, y_batch in train_dataset:
with tf.GradientTape() as tape:
f_loss = cross_entropy(y_batch, model_predict(x_batch))
loss += f_loss
grads = tape.gradient(f_loss, [layer_1.trainable_variables, layer_2.trainable_variables])
opt.apply_gradients(zip(grads[0], layer_1.trainable_variables))
opt.apply_gradients(zip(grads[1], layer_2.trainable_variables))
print(loss.numpy())
y = model_predict(x_test)
y2 = tf.argmax(y, axis=1).numpy()
acc = len(y_test[y_test == y2]) / y_test.shape[0] * 100
print(acc)
y = model_predict(tf.expand_dims(x_test[0], axis=0))
print(y)
model.compile(optimizer='adam', loss='categorical_crossentropy')
model.fit(x_train, y_train, epochs=10)
model.save_weights('model_weights.h5')
Ответы (2 шт):
Автор решения: elderberry17
→ Ссылка
Насколько я знаю (и как сам обычно это делаю), для сохранения ML моделей можно использовать, например, библиотеку pickle
Здесь (https://russianblogs.com/article/45551380910/) доступно и с примерами кода объясняют, как именно это можно сделать (хотя перевели статью так себе).
Надеюсь, сработает!
Автор решения: CrazyElf
→ Ссылка
В документации всё есть, просто загружаете веса в модель, когда она уже описана, вместо тренировки её через model.fit:
model = keras.models.load_model('model_weights.h5n')