Helpex - Trao đổi & giúp đỡ Đăng nhập
79

Trong Keras, chúng ta có thể trả về kết quả đầu ra của model.fitlịch sử như sau:

 history = model.fit(X_train, y_train, 
                     batch_size=batch_size, 
                     nb_epoch=nb_epoch,
                     validation_data=(X_test, y_test))

Bây giờ, làm thế nào để lưu thuộc tính lịch sử của đối tượng lịch sử vào một tệp để sử dụng tiếp (ví dụ: vẽ các âm mưu của acc hoặc mất mát so với các kỷ nguyên)?

79 hữu ích 2 bình luận 69k xem chia sẻ
83

Những gì tôi sử dụng là như sau:

    with open('/trainHistoryDict', 'wb') as file_pi:
        pickle.dump(history.history, file_pi)

Bằng cách này, tôi lưu lịch sử dưới dạng từ điển phòng trường hợp sau này tôi muốn vẽ biểu đồ về sự mất mát hoặc độ chính xác.

83 hữu ích 5 bình luận chia sẻ
38

Một cách khác để làm điều này:

Như history.historylà một dict, bạn có thể chuyển đổi nó cũng như để một pandas DataFrameđối tượng, sau đó có thể được lưu cho phù hợp với nhu cầu của bạn.

Từng bước một:

import pandas as pd

# assuming you stored your model.fit results in a 'history' variable:
history = model.fit(x_train, y_train, epochs=10)

# convert the history.history dict to a pandas DataFrame:     
hist_df = pd.DataFrame(history.history) 

# save to json:  
hist_json_file = 'history.json' 
with open(hist_json_file, mode='w') as f:
    hist_df.to_json(f)

# or save to csv: 
hist_csv_file = 'history.csv'
with open(hist_csv_file, mode='w') as f:
    hist_df.to_csv(f)
38 hữu ích 0 bình luận chia sẻ
18

Cách dễ nhất:

Tiết kiệm:

np.save('my_history.npy',history.history)

Đang tải:

history=np.load('my_history.npy',allow_pickle='TRUE').item()

Sau đó, lịch sử là một từ điển và bạn có thể truy xuất tất cả các giá trị mong muốn bằng cách sử dụng các phím.

18 hữu ích 0 bình luận chia sẻ
17

Các modellịch sử có thể được lưu vào một tập tin như sau

import json
hist = model.fit(X_train, y_train, epochs=5, batch_size=batch_size,validation_split=0.1)
with open('file.json', 'w') as f:
    json.dump(hist.history, f)
17 hữu ích 1 bình luận chia sẻ
11

Một historyđối tượng có một historytrường là một từ điển chứa các số liệu đào tạo khác nhau trải dài trong mọi kỷ nguyên đào tạo. Vì vậy, ví dụ: history.history['loss'][99]sẽ trả lại việc mất mô hình của bạn trong kỷ nguyên đào tạo thứ 100. Để lưu, bạn có thể lưu pickletừ điển này hoặc đơn giản là lưu các danh sách khác nhau từ từ điển này vào tệp thích hợp.

11 hữu ích 0 bình luận chia sẻ
7

Tôi đã gặp phải vấn đề rằng các giá trị bên trong danh sách trong keras không thể phân biệt được. Vì vậy, tôi đã viết hai hàm tiện dụng này cho mục đích sử dụng của tôi.

import json,codecs
import numpy as np
def saveHist(path,history):
    
    new_hist = {}
    for key in list(history.history.keys()):
        new_hist[key]=history.history[key]
        if type(history.history[key]) == np.ndarray:
            new_hist[key] = history.history[key].tolist()
        elif type(history.history[key]) == list:
           if  type(history.history[key][0]) == np.float64:
               new_hist[key] = list(map(float, history.history[key]))
            
    print(new_hist)
    with codecs.open(path, 'w', encoding='utf-8') as file:
        json.dump(new_hist, file, separators=(',', ':'), sort_keys=True, indent=4) 

def loadHist(path):
    with codecs.open(path, 'r', encoding='utf-8') as file:
        n = json.loads(file.read())
    return n

trong đó saveHist chỉ cần lấy đường dẫn đến nơi tệp json sẽ được lưu và đối tượng lịch sử được trả về từ keras fithoặc fit_generatorphương thức.

7 hữu ích 4 bình luận chia sẻ
1

Tôi chắc rằng có nhiều cách để làm điều này, nhưng tôi đã mày mò và nghĩ ra một phiên bản của riêng mình.

Đầu tiên, một lệnh gọi lại tùy chỉnh cho phép lấy và cập nhật lịch sử vào cuối mỗi kỷ nguyên. Trong đó tôi cũng có một cuộc gọi lại để lưu mô hình. Cả hai điều này đều tiện dụng vì nếu bạn gặp sự cố hoặc tắt máy, bạn có thể tiếp tục đào tạo vào thời điểm hoàn thành cuối cùng.

class LossHistory(Callback):

    # https://stackoverflow.com/a/53653154/852795
    def on_epoch_end(self, epoch, logs = None):
        new_history = {}
        for k, v in logs.items(): # compile new history from logs
            new_history[k] = [v] # convert values into lists
        current_history = loadHist(history_filename) # load history from current training
        current_history = appendHist(current_history, new_history) # append the logs
        saveHist(history_filename, current_history) # save history from current training

model_checkpoint = ModelCheckpoint(model_filename, verbose = 0, period = 1)
history_checkpoint = LossHistory()
callbacks_list = [model_checkpoint, history_checkpoint]

Thứ hai, đây là một số chức năng của 'helper' để thực hiện chính xác những điều họ nói là họ làm. Đây là tất cả được gọi từ cuộc LossHistory()gọi lại.

# https://stackoverflow.com/a/54092401/852795
import json, codecs

def saveHist(path, history):
    with codecs.open(path, 'w', encoding='utf-8') as f:
        json.dump(history, f, separators=(',', ':'), sort_keys=True, indent=4) 

def loadHist(path):
    n = {} # set history to empty
    if os.path.exists(path): # reload history if it exists
        with codecs.open(path, 'r', encoding='utf-8') as f:
            n = json.loads(f.read())
    return n

def appendHist(h1, h2):
    if h1 == {}:
        return h2
    else:
        dest = {}
        for key, value in h1.items():
            dest[key] = value + h2[key]
        return dest

Sau đó, tất cả những gì bạn cần là đặt history_filenamethành một cái gì đó giống như data/model-history.json, cũng như đặt model_filesnamemột cái gì đó giống như vậy data/model.h5. Một tinh chỉnh cuối cùng để đảm bảo không làm rối lịch sử của bạn khi kết thúc quá trình đào tạo, giả sử bạn dừng lại và bắt đầu, cũng như dính vào các lệnh gọi lại, là thực hiện điều này:

new_history = model.fit(X_train, y_train, 
                     batch_size = batch_size, 
                     nb_epoch = nb_epoch,
                     validation_data=(X_test, y_test),
                     callbacks=callbacks_list)

history = appendHist(history, new_history.history)

Bất cứ khi nào bạn muốn, hãy history = loadHist(history_filename)lấy lại lịch sử của bạn.

Sự thú vị đến từ json và các danh sách nhưng tôi không thể làm cho nó hoạt động mà không chuyển đổi nó bằng cách lặp lại. Dù sao, tôi biết rằng điều này hiệu quả bởi vì tôi đã tập trung vào nó trong nhiều ngày nay. Câu pickled.dumptrả lời tại https://stackoverflow.com/a/44674337/852795 có thể tốt hơn, nhưng tôi không biết đó là gì. Nếu tôi bỏ lỡ bất cứ điều gì ở đây hoặc bạn không thể làm cho nó hoạt động, hãy cho tôi biết.

1 hữu ích 1 bình luận chia sẻ
0

Các câu trả lời trên rất hữu ích khi lưu lịch sử vào cuối quá trình đào tạo. Nếu bạn muốn lưu lịch sử trong quá trình đào tạo, lệnh gọi lại CSVLogger sẽ rất hữu ích.

Đoạn mã dưới đây lưu huấn luyện lịch sử và trọng lượng mô hình dưới dạng tệp biểu dữ liệu log.csv .

model_cb = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path)
history_cb = tf.keras.callbacks.CSVLogger('./log.csv', separator=",", append=False)

history = model.fit(callbacks=[model_cb, history_cb])
0 hữu ích 0 bình luận chia sẻ
0

Bạn có thể lưu Lịch sử thuộc tính của tf.keras.callbacks.Historytrong .txt dạng

with open("./result_model.txt",'w') as f:
    for k in history.history.keys():
        print(k,file=f)
        for i in history.history[k]:
            print(i,file=f)
0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ python machine-learning neural-network deep-learning keras , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading