【发布时间】:2021-12-06 18:10:50
【问题描述】:
我正在尝试计算 tensorflow 中的梯度,但返回 None。我已经将类型调整为tensorflow.python.framework.ops.EagerTensor,但是htis并没有解决问题。
这是目前为止的代码:
accuracy = tf.keras.metrics.CategoricalAccuracy('accuracy')
loss = tf.keras.metrics.CategoricalCrossentropy('loss')
for epoch in range(epochs):
accuracy.reset_states()
loss.reset_states()
for batch in iterate_minibatches(X_train, y_train, batch_size):
imgs = batch[0]
labels = batch[1]
with tf.GradientTape() as tape:
preds = model(imgs)
labels = tf.convert_to_tensor(labels, dtype=tf.float32)
#print(loss(labels,preds))
# Loss is crossentropy loss with regularization term for each parameter
total_loss = loss(labels, preds) #+l2_penalty(model, theta_A)
grads = tape.gradient(total_loss, model.trainable_variables)
model.optimizer.apply_gradients(zip(grads, model.trainable_variables))
accuracy.update_state(labels, preds)
loss.update_state(labels, preds)
print("\rEpoch: {}, Batch: {}, Loss: {:.3f}, Accuracy: {:.3f}".format(
epoch+1, batch+1, loss.result().numpy(), accuracy.result().numpy()), flush=True, end='')
print("")
print("Task B accuracy after training trained model on Task B: {}".format(model.evaluate(task_B_test)))
print("Task A accuracy after training trained model on Task B: {}".format(model.evaluate(task_A_test)))
有谁知道为什么它没有转或我该如何解决这个问题?
编辑:我的错误消息如下所示:
AttributeError Traceback(最近一次调用最后一次) C:\Users\DC5DE~1.ALB\AppData\Local\Temp/ipykernel_13300/818221091.py 在 34 grads = tape.gradient(total_loss, model.trainable_variables) 35 ---> 36 model.optimizer.apply_gradients(zip(grads, model.trainable_variables)) 37 38 accuracy.update_state(labels, preds)
AttributeError: 'NoneType' 对象没有属性 'apply_gradients'
由于我不确定这是否与我将图像数据传递给 GradientTape 的方式有关,这里是我的小批量函数:
def iterate_minibatches(inputs, targets, batchsize, shuffle=False):
assert inputs.shape[0] == targets.shape[0]
if shuffle:
indices = np.arange(inputs.shape[0])
np.random.shuffle(indices)
for start_idx in range(0, inputs.shape[0] - batchsize + 1, batchsize):
if shuffle:
excerpt = indices[start_idx:start_idx + batchsize]
else:
excerpt = slice(start_idx, start_idx + batchsize)
yield inputs[excerpt], targets[excerpt]
另外:here 提到了一个类似的问题,但是没有任何可行的解决方案。
【问题讨论】:
标签: python tensorflow keras