Estoy tratando de analizar algunos archivos de registro para obtener algunos números y convertirlos en un archivo CSV. Los archivos de registro tienen muchos mensajes de registro, pero a continuación se muestra un extracto de las líneas que deben analizarse.

Estoy tratando de obtener los números de pérdida y precisión de este archivo de texto a continuación en un CSV. ¿Alguna recomendación para trucos de bash o python?

1500/1500 [==============================] - 1802s 1s/step - loss: 0.3430 - accuracy: 0.8753 - val_loss: 0.1110 - val_accuracy: 0.9670
Epoch 00002: saving model to /root/data-cache/data/tmp/models/ota-cfo-10k_20200527-001913_02_0.069291627_0.98.h5
1500/1500 [==============================] - 1679s 1s/step - loss: 0.0849 - accuracy: 0.9739 - val_loss: 0.0693 - val_accuracy: 0.9807
Epoch 00003: saving model to /root/data-cache/data/tmp/models/ota-cfo-10k_20200527-001913_03_0.055876694_0.98.h5
1500/1500 [==============================] - 1674s 1s/step - loss: 0.0742 - accuracy: 0.9791 - val_loss: 0.0559 - val_accuracy: 0.9845
Epoch 00004: saving model to /root/data-cache/data/tmp/models/ota-cfo-10k_20200527-001913_04_0.053867317_0.99.h5
1500/1500 [==============================] - 1671s 1s/step - loss: 0.0565 - accuracy: 0.9841 - val_loss: 0.0539 - val_accuracy: 0.9850
Epoch 00005: saving model to /root/data-cache/data/tmp/models/ota-cfo-10k_20200527-001913_05_0.053266536_0.99.h5
1500/1500 [==============================] - 1675s 1s/step - loss: 0.0409 - accuracy: 0.9881 - val_loss: 0.0533 - val_accuracy: 0.9855

0
random_dsp_guy 29 may. 2020 a las 20:35

4 respuestas

La mejor respuesta

En Python, use grupos de captura con nombre:

(?m)^(?P<iteration>\d+(?:/\d+)?)\s+\[=+]\s+-\s+(?P<seconds>\d+)s\s+1s/step\s+-\s+loss:\s*(?P<loss>\d+\.\d+)\s+-\s+accuracy:\s*(?P<accuracy>\d+\.\d+)\s+-\s+val_loss:\s*(?P<val_loss>\d+\.\d+)\s*-\s*val_accuracy:\s*(?P<val_accuracy>\d+\.\d+)\r?\nEpoch\s+(?P<epoch_num>\d+):\s*saving model to\s*(?P<epoch_file>.*)

Consulte prueba.

Código Python:

regular_exp = re.compile(r'^(?P<iteration>\d+(?:/\d+)?)\s+\[=+]\s+-\s+(?P<seconds>\d+)s\s+1s/step\s+-\s+loss:\s*(?P<loss>\d+\.\d+)\s+-\s+accuracy:\s*(?P<accuracy>\d+\.\d+)\s+-\s+val_loss:\s*(?P<val_loss>\d+\.\d+)\s*-\s*val_accuracy:\s*(?P<val_accuracy>\d+\.\d+)\r?\nEpoch\s+(?P<epoch_num>\d+):\s*saving model to\s*(?P<epoch_file>.*)', re.M)
with open(filepath, 'r') as file:
    results = [ match.groupdict() for match in re.finditer(file.read()) ]

Ver

Ryszard Czech 29 may. 2020 a las 19:58

Para eliminar los campos csv que solicitó a la salida:

$: sed -En '/ loss: [.0-9]+ - accuracy: [.0-9]+ /{ s/^.* loss: ([.0-9]+) - accuracy: ([.0-9]+) .*$/\1,\2/; p; }' the.log
0.3430,0.8753
0.0849,0.9739
0.0742,0.9791
0.0565,0.9841
0.0409,0.9881

Hay muchas maneras de mejorar la robustez y flexibilidad de esto, pero funciona en la muestra proporcionada.

1
Paul Hodges 29 may. 2020 a las 18:36

Con awk puedes hacer algo como esto:

awk -F " " '{print $8,$11}' file.txt | awk 'NF>0{print $1","$2}' > newfile.txt

NF > 0: para eliminar líneas en blanco

> newfile.txt: redirige la salida al archivo

0.3430,0.8753
0.0849,0.9739
0.0742,0.9791
0.0565,0.9841
0.0409,0.9881
1
Mahmoud Odeh 29 may. 2020 a las 21:18

Poniendo esas cosas en test.log ...

egrep -o  " loss: [0-9\.]* | accuracy: [0-9\.]* " test.log
 loss: 0.3430 
 accuracy: 0.8753 
 loss: 0.0849 
 accuracy: 0.9739 
 loss: 0.0742 
 accuracy: 0.9791 
 loss: 0.0565 
 accuracy: 0.9841 
 loss: 0.0409 
 accuracy: 0.9881 
1
Jack 29 may. 2020 a las 18:04