Объект Keras model.summary() для строки
Я хочу написать файл *.txt с гиперпараметрами нейронной сети и архитектурой модели. Можно ли записать объектную модель .summary() в мой выходной файл?
(...)
summary = str(model.summary())
(...)
out = open(filename + 'report.txt','w')
out.write(summary)
out.close
Случается, что я получаю "None", как вы можете видеть ниже.
Hyperparameters
=========================
learning_rate: 0.01
momentum: 0.8
decay: 0.0
batch size: 128
no. epochs: 3
dropout: 0.5
-------------------------
None
val_acc: 0.232323229313
val_loss: 3.88496732712
train_acc: 0.0965207634216
train_loss: 4.07161939425
train/val loss ratio: 1.04804469418
Есть идеи, как с этим бороться?
Ответы
Ответ 1
С моей версией Keras (2.0.6
) и Python (3.5.0
) это работает для меня:
# Create an empty model
from keras.models import Sequential
model = Sequential()
# Open the file
with open(filename + 'report.txt','w') as fh:
# Pass the file handle in as a lambda function to make it callable
model.summary(print_fn=lambda x: fh.write(x + '\n'))
Это выводит следующие строки в файл:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
Total params: 0
Trainable params: 0
Non-trainable params: 0
_________________________________________________________________
Ответ 2
И если вы хотите записать в журнал:
import logging
logger = logging.getLogger(__name__)
model.summary(print_fn=logger.info)
Ответ 3
Это не лучший способ сделать это, но вы можете сделать это, чтобы перенаправить stdout:
orig_stdout = sys.stdout
f = open('out.txt', 'w')
sys.stdout = f
print(model.summary())
sys.stdout = orig_stdout
f.close()
см. "Как перенаправить вывод" print "в файл с помощью python?"
Ответ 4
Один из вариантов, хотя и не является точной заменой model.summary, - экспортировать конфигурацию модели с помощью model.get_config()
. Из документов:
model.get_config()
: возвращает словарь, содержащий конфигурацию модели. Модель можно восстановить из конфигурации через:
config = model.get_config()
model = Model.from_config(config)
# or, for Sequential:
model = Sequential.from_config(config)
Ответ 5
Для меня это сработало, чтобы просто получить сводку модели в виде строки:
stringlist = []
model.summary(print_fn=lambda x: stringlist.append(x))
short_model_summary = "\n".join(stringlist)
print(short_model_summary)
Ответ 6
Я тоже наткнулся на ту же проблему!
Возможны два способа обхода:
Использовать метод to_json()
модели
summary = str(model.to_json())
Это ваш случай выше.
В противном случае используйте метод ascii из keras_diagram
from keras_diagram import ascii
summary = ascii(model)
Ответ 7
Я понимаю, что OP уже принял ответ winni2k, но поскольку заголовок вопроса фактически подразумевает сохранение выходных данных model.summary()
в строку, а не в файл, следующий код может помочь другим, которые приходят на эту страницу в поисках этого (например, Я сделал).
Приведенный ниже код был запущен с использованием 1.12.0
, который поставляется с Keras 2.1.6-tf
на Python 3.6.2
.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
import io
# Example model
model = Sequential([
Dense(32, input_shape=(784,)),
Activation('relu'),
Dense(10),
Activation('softmax'),
])
def get_model_summary(model):
stream = io.StringIO()
model.summary(print_fn=lambda x: stream.write(x + '\n'))
summary_string = stream.getvalue()
stream.close()
return summary_string
model_summary_string = get_model_summary(model)
print(model_summary_string)
Что дает (в виде строки):
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 32) 25120
_________________________________________________________________
activation (Activation) (None, 32) 0
_________________________________________________________________
dense_1 (Dense) (None, 10) 330
_________________________________________________________________
activation_1 (Activation) (None, 10) 0
=================================================================
Total params: 25,450
Trainable params: 25,450
Non-trainable params: 0
_________________________________________________________________