9

Tôi đang đào tạo một RNN bằng cách sử dụng keras và muốn xem mức độ chính xác của việc xác nhận thay đổi với kích thước tập dữ liệu như thế nào. Keras có một danh sách gọi là val_acc trong đối tượng lịch sử của nó được nối sau mỗi kỷ nguyên với độ chính xác thiết lập xác nhận tương ứng (link to the post in google group). Tôi muốn lấy mức trung bình là val_acc cho số lần epoch chạy và âm mưu so với kích thước tập dữ liệu tương ứng.Làm thế nào để vẽ một đường cong học tập cho một thí nghiệm keras?

Câu hỏi: Tôi làm cách nào để truy lục các phần tử trong danh sách val_acc và thực hiện thao tác như numpy.mean(val_acc)?


EDIT: Như @runDOSrun nói, nhận được giá trị trung bình của val_acc s không có ý nghĩa. Hãy để tôi tập trung vào việc nhận được val_acc cuối cùng.

Tôi đã thử những gì được đề xuất bởi @nemo nhưng không may mắn. Dưới đây là những gì tôi nhận được khi tôi in

model.fit(X_train, y_train, batch_size = 512, nb_epoch = 5, validation_split = 0.05).__dict__

đầu ra:

{'model': <keras.models.Sequential object at 0x000000001F752A90>, 'params': {'verbose': 1, 'nb_epoch': 5, 'batch_size': 512, 'metrics': ['loss', 'val_loss'], 'nb_sample': 1710, 'do_validation': True}, 'epoch': [0, 1, 2, 3, 4], 'history': {'loss': [0.96936064512408959, 0.66933631673890948, 0.63404161288724303, 0.62268789783555867, 0.60833334699708819], 'val_loss': [0.84040999412536621, 0.75676006078720093, 0.73714292049407959, 0.71032363176345825, 0.71341043710708618]}} 

Hóa ra không có danh sách như val_acc trong từ điển lịch sử của tôi.

Câu hỏi: Cách bao gồm val_acc vào từ history từ điển?

Trả lời

2

Đối tượng lịch sử được tạo trong khi fit() ghi hình mẫu. Xem keras/engine/training.py để biết chi tiết.

Bạn có thể truy cập lịch sử bằng cách sử dụng thuộc tính history trên mô hình: model.history.

Sau khi lắp mô hình, bạn chỉ đơn giản là trung bình trên thuộc tính.

np.mean([v['val_acc'] for v in model.history]) 

Lưu ý rằng mẫu là val_<your output name here> cho mọi đầu ra bạn chỉ định.

+0

Cảm ơn @nemo câu trả lời, Can bạn hãy xem bản chỉnh sửa gần đây của tôi? – akilat90

2

Tại sao bạn tìm thấy độ chính xác trung bình quan trọng hơn độ chính xác cuối cùng? Tùy thuộc vào giá trị ban đầu của bạn, mức trung bình của bạn có thể khá sai lệch. Thật dễ dàng để tìm ra các đường cong khác nhau có cùng cách giải thích trung bình nhưng khác nhau.

Tôi chỉ vẽ toàn bộ lịch sử của train_accval_acc để quyết định xem RNN có hoạt động tốt trong thiết lập đã cho hay không. Và cũng đừng quên để có một kích thước mẫu N> 1. Khởi tạo ngẫu nhiên có thể có tác động lớn đến RNN, mất ít nhất N = 10 khởi tạo khác nhau cho mỗi thiết lập để đảm bảo rằng hiệu suất khác nhau thực sự là do kích thước thiết lập của bạn và không phải do khởi tạo tốt hơn/tệ hơn.

+1

cảm ơn vì đã khiến tôi suy nghĩ về điều đó. Có, tôi đã sai và chỉ phớt lờ thực tế rằng mạng trở nên tốt hơn trong mỗi thời đại. Theo nghĩa đó, như bạn đã nói, việc nhận được 'val_acc' cuối cùng là đủ. – akilat90

3

Để nhận giá trị độ chính xác, bạn cần yêu cầu chúng được tính trong thời gian fit, vì độ chính xác không phải là hàm mục tiêu, mà là số liệu (phổ biến). Đôi khi tính toán chính xác không có ý nghĩa, do đó, nó không được kích hoạt theo mặc định trong Keras. Tuy nhiên, đây là số liệu được tích hợp sẵn và dễ dàng thêm vào.

Để thêm số liệu, sử dụng metrics=['accuracy'] tham số để model.fit:

Trong ví dụ của bạn:

history = model.fit(X_train, y_train, batch_size = 512, 
      nb_epoch = 5, validation_split = 0.05, metrics=['accuracy']) 

Sau đó bạn có thể truy cập chính xác xác nhận như history.history['val_acc']

Các vấn đề liên quan