Trang này được dịch bởi Cloud Translation API.
Switch to English

Truy cập dữ liệu TensorBoard dưới dạng DataFrames

Tổng quat

Tính năng chính của TensorBoard là GUI tương tác của nó. Tuy nhiên, người dùng đôi khi muốn lập trình đọc các bản ghi dữ liệu được lưu trữ trong TensorBoard, cho các mục đích như thực hiện phân tích hậu hoc và tạo trực quan hóa dữ liệu nhật ký tùy chỉnh.

TensorBoard 2.3 hỗ trợ trường hợp sử dụng này với tensorboard.data.experimental.ExperimentFromDev() . Nó cho phép truy cập theo chương trình vào các bản ghi vô hướng của TensorBoard. Trang này trình bày cách sử dụng cơ bản của API mới này.

Thiết lập

Để sử dụng API lập trình, hãy đảm bảo bạn cài đặt pandas cùng với tensorboard .

Chúng tôi sẽ sử dụng matplotlibseaborn cho các ô tùy chỉnh trong hướng dẫn này, nhưng bạn có thể chọn công cụ ưa thích của mình để phân tích và trực quan hóa DataFrame .

pip install tensorboard pandas
pip install matplotlib seaborn
 from packaging import version

import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
from scipy import stats
import tensorboard as tb
 
 major_ver, minor_ver, _ = version.parse(tb.__version__).release
assert major_ver >= 2 and minor_ver >= 3, \
    "This notebook requires TensorBoard 2.3 or later."
print("TensorBoard version: ", tb.__version__)
 
TensorBoard version:  2.3.0a20200626

Đang tải vô hướng TensorBoard dưới dạng pandas.DataFrame

Khi một logdir của TensorBoard đã được tải lên TensorBoard.dev, nó sẽ trở thành cái mà chúng ta gọi là một thử nghiệm . Mỗi thử nghiệm có một ID duy nhất, có thể được tìm thấy trong URL TensorBoard.dev của thử nghiệm. Để trình diễn dưới đây, chúng tôi sẽ sử dụng thử nghiệm TensorBoard.dev tại: https://tensorboard.dev/experiment/c1KCv3X3QvGwaXfgX1c4tg

 experiment_id = "c1KCv3X3QvGwaXfgX1c4tg"
experiment = tb.data.experimental.ExperimentFromDev(experiment_id)
df = experiment.get_scalars()
df
 

df là một pandas.DataFrame chứa tất cả các bản ghi vô hướng của thí nghiệm.

Các cột của DataFrame là:

  • run : mỗi lần chạy tương ứng với một thư mục con của logdir gốc. Trong thí nghiệm này, mỗi lần chạy là từ một khóa đào tạo hoàn chỉnh của mạng nơ ron tích chập (CNN) trên tập dữ liệu MNIST với một loại trình tối ưu hóa nhất định (một siêu tham số đào tạo). DataFrame này chứa nhiều lần chạy như vậy, tương ứng với các lần đào tạo lặp đi lặp lại dưới các loại trình tối ưu hóa khác nhau.
  • tag : điều này mô tả value trong cùng một hàng nghĩa là gì, nghĩa là giá trị nào đại diện cho hàng. Trong thử nghiệm này, chúng tôi chỉ có hai thẻ duy nhất: epoch_accuracyepoch_loss cho các số liệu chính xác và mất tương ứng.
  • step : Đây là một số phản ánh thứ tự nối tiếp của hàng tương ứng trong lần chạy của nó. Ở đây step thực sự đề cập đến số epoch. Nếu bạn muốn có được dấu thời gian ngoài các giá trị step , bạn có thể sử dụng đối số từ khóa include_wall_time=True get_scalars() include_wall_time=True khi gọi get_scalars() .
  • value : Đây là giá trị số thực tế của lãi suất. Như được mô tả ở trên, mỗi value trong DataFrame cụ thể này là một mất mát hoặc độ chính xác, tùy thuộc vào tag của hàng.
 print(df["run"].unique())
print(df["tag"].unique())
 
['adam,run_1/train' 'adam,run_1/validation' 'adam,run_2/train'
 'adam,run_2/validation' 'adam,run_3/train' 'adam,run_3/validation'
 'adam,run_4/train' 'adam,run_4/validation' 'adam,run_5/train'
 'adam,run_5/validation' 'rmsprop,run_1/train' 'rmsprop,run_1/validation'
 'rmsprop,run_2/train' 'rmsprop,run_2/validation' 'rmsprop,run_3/train'
 'rmsprop,run_3/validation' 'rmsprop,run_4/train'
 'rmsprop,run_4/validation' 'rmsprop,run_5/train'
 'rmsprop,run_5/validation' 'sgd,run_1/train' 'sgd,run_1/validation'
 'sgd,run_2/train' 'sgd,run_2/validation' 'sgd,run_3/train'
 'sgd,run_3/validation' 'sgd,run_4/train' 'sgd,run_4/validation'
 'sgd,run_5/train' 'sgd,run_5/validation']
['epoch_accuracy' 'epoch_loss']

Lấy DataFrame có trục (dạng rộng)

Trong thử nghiệm của chúng tôi, hai thẻ ( epoch_lossepoch_accuracy ) có mặt ở cùng một bộ các bước trong mỗi lần chạy. Điều này cho phép có được một DataFrame "dạng rộng" trực tiếp từ get_scalars() bằng cách sử dụng đối số từ khóa get_scalars() pivot=True . DataFrame dạng DataFrame có tất cả các thẻ của nó được bao gồm dưới dạng các cột của DataFrame, thuận tiện hơn để làm việc trong một số trường hợp bao gồm cả thẻ này.

Tuy nhiên, hãy cẩn thận nếu điều kiện có các bộ giá trị bước thống nhất trên tất cả các thẻ trong tất cả các lần chạy không được đáp ứng, sử dụng pivot=True sẽ dẫn đến lỗi.

 dfw = experiment.get_scalars(pivot=True) 
dfw
 

Lưu ý rằng thay vì một cột "giá trị" duy nhất, DataFrame dạng rộng bao gồm hai thẻ (số liệu) như các cột của nó một cách rõ ràng: epoch_accuracyepoch_loss .

Lưu DataFrame dưới dạng CSV

pandas.DataFrame có khả năng tương tác tốt với CSV . Bạn có thể lưu trữ dưới dạng tệp CSV cục bộ và tải lại sau. Ví dụ:

 csv_path = '/tmp/tb_experiment_1.csv'
dfw.to_csv(csv_path, index=False)
dfw_roundtrip = pd.read_csv(csv_path)
pd.testing.assert_frame_equal(dfw_roundtrip, dfw)
 

Thực hiện trực quan tùy chỉnh và phân tích thống kê

 # Filter the DataFrame to only validation data, which is what the subsequent
# analyses and visualization will be focused on.
dfw_validation = dfw[dfw.run.str.endswith("/validation")]
# Get the optimizer value for each row of the validation DataFrame.
optimizer_validation = dfw_validation.run.apply(lambda run: run.split(",")[0])

plt.figure(figsize=(16, 6))
plt.subplot(1, 2, 1)
sns.lineplot(data=dfw_validation, x="step", y="epoch_accuracy",
             hue=optimizer_validation).set_title("accuracy")
plt.subplot(1, 2, 2)
sns.lineplot(data=dfw_validation, x="step", y="epoch_loss",
             hue=optimizer_validation).set_title("loss")
 
Text(0.5, 1.0, 'loss')

png

Các sơ đồ trên cho thấy các bảng thời gian về độ chính xác xác thực và mất xác nhận. Mỗi đường cong cho thấy trung bình trên 5 lần chạy dưới một loại tối ưu hóa. Nhờ tính năng tích hợp của seaborn.lineplot() , mỗi đường cong cũng hiển thị độ lệch chuẩn 1 1 xung quanh giá trị trung bình, cho chúng ta cảm nhận rõ ràng về sự thay đổi trong các đường cong này và tầm quan trọng của sự khác biệt giữa ba loại tối ưu hóa. Hình dung về tính biến đổi này chưa được hỗ trợ trong GUI của TensorBoard.

Chúng tôi muốn nghiên cứu giả thuyết rằng tổn thất xác nhận tối thiểu khác nhau đáng kể so với tối ưu hóa "adam", "rmsprop" và "sgd". Vì vậy, chúng tôi trích xuất một DataFrame cho việc mất xác thực tối thiểu theo từng trình tối ưu hóa.

Sau đó, chúng tôi tạo ra một boxplot để hình dung sự khác biệt trong tổn thất xác nhận tối thiểu.

 adam_min_val_loss = dfw_validation.loc[optimizer_validation=="adam", :].groupby(
    "run", as_index=False).agg({"epoch_loss": "min"})
rmsprop_min_val_loss = dfw_validation.loc[optimizer_validation=="rmsprop", :].groupby(
    "run", as_index=False).agg({"epoch_loss": "min"})
sgd_min_val_loss = dfw_validation.loc[optimizer_validation=="sgd", :].groupby(
    "run", as_index=False).agg({"epoch_loss": "min"})
min_val_loss = pd.concat([adam_min_val_loss, rmsprop_min_val_loss, sgd_min_val_loss])

sns.boxplot(data=min_val_loss, y="epoch_loss",
            x=min_val_loss.run.apply(lambda run: run.split(",")[0]))
 
<matplotlib.axes._subplots.AxesSubplot at 0x7f5e017c8150>

png

 # Perform pairwise comparisons between the minimum validation losses
# from the three optimizers.
_, p_adam_vs_rmsprop = stats.ttest_ind(
    adam_min_val_loss["epoch_loss"],
    rmsprop_min_val_loss["epoch_loss"]) 
_, p_adam_vs_sgd = stats.ttest_ind(
    adam_min_val_loss["epoch_loss"],
    sgd_min_val_loss["epoch_loss"]) 
_, p_rmsprop_vs_sgd = stats.ttest_ind(
    rmsprop_min_val_loss["epoch_loss"],
    sgd_min_val_loss["epoch_loss"]) 
print("adam vs. rmsprop: p = %.4f" % p_adam_vs_rmsprop)
print("adam vs. sgd: p = %.4f" % p_adam_vs_sgd)
print("rmsprop vs. sgd: p = %.4f" % p_rmsprop_vs_sgd)
 
adam vs. rmsprop: p = 0.0244
adam vs. sgd: p = 0.9749
rmsprop vs. sgd: p = 0.0135

Do đó, ở mức ý nghĩa 0,05, phân tích của chúng tôi xác nhận giả thuyết của chúng tôi rằng tổn thất xác nhận tối thiểu cao hơn đáng kể (nghĩa là tệ hơn) trong trình tối ưu hóa rmsprop so với hai trình tối ưu hóa khác có trong thí nghiệm của chúng tôi.

Tóm lại, hướng dẫn này cung cấp một ví dụ về cách truy cập dữ liệu vô hướng dưới dạng panda.DataFrame từ TensorBoard.dev. Nó cho thấy loại phân tích và trực quan hóa linh hoạt và mạnh mẽ mà bạn có thể thực hiện với s DataFrame .