web-dev-qa-db-fra.com

Keras model.summary () objet en chaîne

Je veux écrire un fichier * .txt avec les hyperparamètres de réseau de neurones et l'architecture de modèle. Est-il possible d'écrire l'objet model.summary () dans mon fichier de sortie?

(...)
summary = str(model.summary())
(...)
out = open(filename + 'report.txt','w')
out.write(summary)
out.close

Il se trouve que je reçois un "Aucun" comme vous pouvez le voir ci-dessous.

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

Une idée de comment gérer ça? Merci

22
lmpeixoto

Avec ma version de Keras (2.0.6) et Python (3.5.0), cela fonctionne pour moi:

# 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'))

Cela génère les lignes suivantes dans le fichier:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
Total params: 0
Trainable params: 0
Non-trainable params: 0
_________________________________________________________________
19
winni2k

Ce n'est pas la meilleure façon de le faire, mais vous pouvez aussi rediriger stdout:

orig_stdout = sys.stdout
f = open('out.txt', 'w')
sys.stdout = f
print(model.summary())
sys.stdout = orig_stdout
f.close()

voir "Comment rediriger la sortie 'print' vers un fichier en utilisant python?"

7
Maryam Hnr

Une option, bien que n'étant pas un remplacement exact pour model.summary, consiste à exporter la configuration d'un modèle à l'aide de model.get_config(). De les docs :

model.get_config(): renvoie un dictionnaire contenant la configuration du modèle. Le modèle peut être réinitialisé à partir de sa configuration via:

config = model.get_config()
model = Model.from_config(config)
# or, for Sequential:
model = Sequential.from_config(config)
4
jkdev

Et si vous voulez écrire dans un journal:

import logging
logger = logging.getLogger(__name__)

model.summary(print_fn=logger.info)
3
ajb

Je suis aussi tombé sur le même problème!

Utiliser la méthode to_json() du modèle 

summary = str(model.to_json()) 

Ceci est votre cas ci-dessus.

Sinon, utilisez la méthode ascii de keras_diagram

from keras_diagram import ascii
summary = ascii(model)
3
sunil manikani

Pour moi, cela a fonctionné pour obtenir simplement le résumé du modèle sous forme de chaîne:

stringlist = []
model.summary(print_fn=lambda x: stringlist.append(x))
short_model_summary = "\n".join(stringlist)
print(short_model_summary)
2
FAnders

Je comprends que le PO a déjà accepté la réponse de winni2k, mais puisque le titre de la question implique en fait de sauvegarder les sorties de model.summary() dans un string , et non dans un fichier, le code suivant pourrait aider les autres utilisateurs de cette page (comme J'ai fait).

Le code ci-dessous a été exécuté à l'aide de TensorFlow 1.12.0, fourni avec Keras 2.1.6-tf sur 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)

Quels rendements (sous forme de chaîne):

_________________________________________________________________
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
_________________________________________________________________
1
Pasa