О моделях Keras
В Keras существует два основных типа моделей: модель Sequential и класс Model, используемый с функциональным API.
Эти модели имеют ряд общих методов и атрибутов:
- model.layers это список слоев, составляющих модель..
- model.inputs это список входных тензоров модели.
- model.outputs это список выходных тензоров модели.
- model.summary() распечатывает сводное представление Вашей модели. Для слоев с несколькими выходами, multiple отображается вместо каждой отдельной выходной формы из-за ограничений по размеру.
- Ссылка на utils.print_summary
- model.get_config()возвращает словарь, содержащий конфигурацию модели. Модель может быть переустановлена из конфигурации через:
config = model.get_config()
model = Model.from_config(config)# или, для Sequential:
model = Sequential.from_config(config)
- model.get_weights() возвращает список всех тензоров веса в модели, в виде Numpy массивов.
- model.set_weights(weights) устанавливает значения весов модели из списка Numpy массивов. Массивы в списке должны иметь ту же форму, что и массивы, возвращаемые функцией get_weights().
- model.to_json() возвращает представление модели в виде JSON строки. Обратите внимание, что представление не включает в себя веса, а только архитектуру. Вы можете переустановить ту же самую модель (с повторно инициализированными весами) из JSON строки через:
from keras.models import model_from_json
json_string = model.to_json()
model = model_from_json(json_string)
- model.to_yaml() возвращает представление модели в виде YAML-строки. Обратите внимание, что представление не включает в себя веса, а только архитектуру. Вы можете переустановить ту же самую модель (с повторно инициализированными весами) из строки YAML via:
from keras.models import model_from_yaml
yaml_string = model.to_yaml()
model = model_from_yaml(yaml_string)
- model.save_weights(filepath) сохраняет веса модели в виде файла HDF5.
- model.load_weights(filepath, by_name=False) загружает веса модели из файла HDF5 (созданного с помощью save_weights). По умолчанию ожидается, что архитектура останется неизменной. Для загрузки весов в другую архитектуру (с общими для некоторых слоев) используйте by_name=True для загрузки только тех слоев с одинаковым именем.
Примечание: Как установить HDF5 или h5py для сохранения моделей в Keras? Смотрите FAQ для получения инструкций по установке h5py.
Подклассификация моделей
В дополнение к этим двум типам моделей, вы можете создавать свои собственные полностью настраиваемые модели, разместив класс Model и реализовав свою собственную переадресацию в методе вызова (API класса Model было введено в Keras 2.2.0).
Приведем пример простой многослойной модели перцептрона, написанной как подкласс Модель:
import keras
class SimpleMLP(keras.Model):
def __init__(self, use_bn=False, use_dp=False, num_classes=10):
super(SimpleMLP, self).__init__(name=’mlp’)
self.use_bn = use_bn
self.use_dp = use_dp
self.num_classes = num_classes
self.dense1 = keras.layers.Dense(32, activation=’relu’)
self.dense2 = keras.layers.Dense(num_classes, activation=’softmax’)
if self.use_dp:
self.dp = keras.layers.Dropout(0.5)
if self.use_bn:
self.bn = keras.layers.BatchNormalization(axis=-1)
def call(self, inputs):
x = self.dense1(inputs)
if self.use_dp:
x = self.dp(x)
if self.use_bn:
x = self.bn(x)
return self.dense2(x)
model = SimpleMLP()
model.compile(…)
model.fit(…)
Слои определены в __init__(self, …), а в call(self, inputs) указан прямой проход. В вызове можно указать пользовательские потери, вызвав self.add_loss(loss_tensor) (как в пользовательском слое).
В подклассовых моделях топология модели определяется как код Python (а не как статический график слоев). Это означает, что топология модели не может быть проверена или сериализована. В результате, следующие методы и атрибуты недоступны для подклассовых моделей:
- model.inputs and model.outputs.
- model.to_yaml() and model.to_json()
- model.get_config() and model.save().
Ключевой момент: используйте правильный API для задания. API подкласса «Model» может предоставить вам большую гибкость для реализации сложных моделей, но это стоит дорого (в дополнение к этим отсутствующим возможностям): он более многословен, сложен и имеет больше возможностей для пользовательских ошибок. Если возможно, предпочитайте использовать функциональный API, который более удобен в использовании.