提交 e320bf8a 编写于 作者: A Aston Zhang

sync lib

上级 463ed646
......@@ -1352,10 +1352,8 @@ def train_concise_ch11(trainer_fn, hyperparams, data_iter, num_epochs=2):
net.add(tf.keras.layers.Dense(1,
kernel_initializer=tf.random_normal_initializer(stddev=0.01)))
optimizer = trainer_fn(**hyperparams)
# 注意:MeanSquaredError计算平方误差时不带系数1/2
loss = tf.keras.losses.MeanSquaredError()
# 注意:L2Loss=1/2*MSELoss。
# TensorFlow的MSE损失与MXNet的L2损失大概相差2倍。
# 因此,我们将TensorFlow中的损失减半
animator = d2l.Animator(xlabel='epoch', ylabel='loss',
xlim=[0, num_epochs], ylim=[0.22, 0.35])
n, timer = 0, d2l.Timer()
......@@ -1363,7 +1361,7 @@ def train_concise_ch11(trainer_fn, hyperparams, data_iter, num_epochs=2):
for X, y in data_iter:
with tf.GradientTape() as g:
out = net(X)
l = loss(y, out)/2
l = loss(y, out)
params = net.trainable_variables
grads = g.gradient(l, params)
optimizer.apply_gradients(zip(grads, params))
......@@ -1372,7 +1370,7 @@ def train_concise_ch11(trainer_fn, hyperparams, data_iter, num_epochs=2):
timer.stop()
p = n/X.shape[0]
q = p/tf.data.experimental.cardinality(data_iter).numpy()
r = (d2l.evaluate_loss(net, data_iter, loss)/2,)
r = (d2l.evaluate_loss(net, data_iter, loss),)
animator.add(q, r)
timer.start()
print(f'loss: {animator.Y[0][-1]:.3f}, {timer.avg():.3f} sec/epoch')
......
......@@ -259,15 +259,13 @@ def train_epoch_ch3(net, train_iter, loss, updater):
if isinstance(updater, torch.optim.Optimizer):
# 使用PyTorch内置的优化器和损失函数
updater.zero_grad()
l.backward()
l.sum().backward()
updater.step()
metric.add(float(l) * len(y), accuracy(y_hat, y),
y.size().numel())
else:
# 使用定制的优化器和损失函数
l.sum().backward()
updater(X.shape[0])
metric.add(float(l.sum()), accuracy(y_hat, y), y.numel())
metric.add(float(l.sum()), accuracy(y_hat, y), y.numel())
# 返回训练损失和训练精度
return metric[0] / metric[2], metric[1] / metric[2]
......@@ -1415,8 +1413,8 @@ def train_concise_ch11(trainer_fn, hyperparams, data_iter, num_epochs=4):
optimizer = trainer_fn(net.parameters(), **hyperparams)
loss = nn.MSELoss()
# L2Loss=1/2*MSELoss
# 注意:MSELoss计算平方误差时不带系数1/2
loss = nn.MSELoss(reduction='none')
animator = d2l.Animator(xlabel='epoch', ylabel='loss',
xlim=[0, num_epochs], ylim=[0.22, 0.35])
n, timer = 0, d2l.Timer()
......@@ -1425,14 +1423,14 @@ def train_concise_ch11(trainer_fn, hyperparams, data_iter, num_epochs=4):
optimizer.zero_grad()
out = net(X)
y = y.reshape(out.shape)
l = loss(out, y)/2
l.backward()
l = loss(out, y)
l.mean().backward()
optimizer.step()
n += X.shape[0]
if n % 200 == 0:
timer.stop()
animator.add(n/X.shape[0]/len(data_iter),
(d2l.evaluate_loss(net, data_iter, loss)/2,))
(d2l.evaluate_loss(net, data_iter, loss),))
timer.start()
print(f'loss: {animator.Y[0][-1]:.3f}, {timer.avg():.3f} sec/epoch')
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册