绘制张量流中许多列车的平均损失的优雅方法
Elegant way to plot average loss of many trains in tensorflow
我是 运行 多次火车迭代,所以我可以平滑损失曲线。我想要一种优雅的方法来平均来自 history.history['loss']
的所有损失,但还没有找到一种简单的方法来做到这一点。这是一个最小的例子:
import tensorflow as tf
from tensorflow.keras.utils import to_categorical
from matplotlib import pyplot as plt
(x_train, y_train), _ = tf.keras.datasets.mnist.load_data()
x_train = x_train.reshape(60000, 784).astype('float32')/255
y_train = to_categorical(y_train, num_classes=10)
def get_model():
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(10, activation='sigmoid',
input_shape=(784,)))
model.add(tf.keras.layers.Dense(10, activation='softmax'))
model.compile(loss="categorical_crossentropy", optimizer="sgd",
metrics = ['accuracy'])
return model
all_trains = []
for i in range(3):
model = get_model()
history = model.fit(x_train, y_train, epochs=2)
all_trains.append(history)
如果我只想绘制一个示例,我会这样做:
plt.plot(history.epoch, history.history['loss'])
plt.show()
但是,我想对 all_trains
中每列火车的损失进行平均并绘制它们。我可以想到许多笨拙的方法来做到这一点,但想找到一种干净的方法。
你可以简单地做:
import numpy as np
import matplotlib.pyplot as plt
losses = [h.history['loss'] for h in all_trains]
mean_loss = np.mean(losses, axis=0)
std = np.std(losses, axis=0)
plt.errorbar(range(len(mean_loss)), mean_loss, yerr=std, capsize=5, marker='o')
plt.title('Average loss per epoch (± std)')
plt.xlabel('Epoch')
plt.ylabel('Categorical crossentropy')
plt.show()
在这种情况下我还添加了标准偏差。
我是 运行 多次火车迭代,所以我可以平滑损失曲线。我想要一种优雅的方法来平均来自 history.history['loss']
的所有损失,但还没有找到一种简单的方法来做到这一点。这是一个最小的例子:
import tensorflow as tf
from tensorflow.keras.utils import to_categorical
from matplotlib import pyplot as plt
(x_train, y_train), _ = tf.keras.datasets.mnist.load_data()
x_train = x_train.reshape(60000, 784).astype('float32')/255
y_train = to_categorical(y_train, num_classes=10)
def get_model():
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(10, activation='sigmoid',
input_shape=(784,)))
model.add(tf.keras.layers.Dense(10, activation='softmax'))
model.compile(loss="categorical_crossentropy", optimizer="sgd",
metrics = ['accuracy'])
return model
all_trains = []
for i in range(3):
model = get_model()
history = model.fit(x_train, y_train, epochs=2)
all_trains.append(history)
如果我只想绘制一个示例,我会这样做:
plt.plot(history.epoch, history.history['loss'])
plt.show()
但是,我想对 all_trains
中每列火车的损失进行平均并绘制它们。我可以想到许多笨拙的方法来做到这一点,但想找到一种干净的方法。
你可以简单地做:
import numpy as np
import matplotlib.pyplot as plt
losses = [h.history['loss'] for h in all_trains]
mean_loss = np.mean(losses, axis=0)
std = np.std(losses, axis=0)
plt.errorbar(range(len(mean_loss)), mean_loss, yerr=std, capsize=5, marker='o')
plt.title('Average loss per epoch (± std)')
plt.xlabel('Epoch')
plt.ylabel('Categorical crossentropy')
plt.show()
在这种情况下我还添加了标准偏差。