Open dongshenll opened 4 years ago
您好,请问一下您这个数据集是以什么结构设置的?,您这个数据处理的代码没有太看明白。
是这样的:假设你有五个分类的任务,所以一个任务中你将会有“五种”图片,那么每一种分类有k张图片作为support set,另外还有q张图片作为query set,所以“一个任务”就会有 n*(k + q)张图片。这只是一个任务,还得加上batch size维度。如果batch size是,则一个Batch就有8个任务。
另外,这个代码我也是自己参考别人写的。实在找不到哪里和论文不一致了,就是训练不出结果。
好的好的 谢谢
您好,我自己也在写一个MAML的算例,参考的时候发现了代码中可能的问题,MAML中 参数应该是只进行第二次的gradient, 第一次的gradient不进行迭代的,我看到train中第一次也迭代了,可能是这个地方的问题导致这个代码训练不出来。
您好,我自己也在写一个MAML的算例,参考的时候发现了代码中可能的问题,MAML中 参数应该是只进行第二次的gradient, 第一次的gradient不进行迭代的,我看到train中第一次也迭代了,可能是这个地方的问题导致这个代码训练不出来。
我不知道你说的第一次的gradient不进行迭代,是指不计算梯度信息,还是计算了梯度信息,把梯度信息更新进去。但实际上我是这样一个思路: 1、我在每一个batch_task开始时,先拷贝一份权重信息。 2、对support_set进行梯度下降,得到一个更新后的权重模型。 3、用新的模型计算query_set的loss,记为query_loss。 4、恢复原来的权重信息,然后利用query_loss计算出梯度,并且更新梯度。 这就是我train部分的过程。而validation的过程四步都一样,计算出query_loss,而不更新梯度。
然后我现在的现象是,train loss 和 train acc是会正常下降和上升的。但是validation的loss就会上升,acc基本维持在20%。 你可以详细说说我的问题在哪吗?
我也是刚刚才开始学MAML,可能说的有问题。 不进行迭代指的是不更新梯度信息,从你这说法里并没有看出来什么问题。 我之前是没有注意到重载了权重信息,所以误以为权重一个batch更新了两次,是我没有看清楚,这个地方应该没有问题。
但是在我看来在validition的过程中,最后又将初始的没有更新的梯度重新赋值到model中应该起不到作用吧。
我也是刚刚才开始学MAML,可能说的有问题。 不进行迭代指的是不更新梯度信息,从你这说法里并没有看出来什么问题。 我之前是没有注意到重载了权重信息,所以误以为权重一个batch更新了两次,是我没有看清楚,这个地方应该没有问题。
但是在我看来在validition的过程中,最后又将初始的没有更新的梯度重新赋值到model中应该起不到作用吧。
因为validation仅仅只是测试,train完之后的权重是不能在验证阶段修改。这和普通的模型训练应该是一样的,应该只是看看他在新数据上的泛化能力。
噢噢,谢谢解释, 我是看到文章里提到MAML可以实现更快速的训练,所以觉得测试应该是直接像普通训练过程一样,只是loss下降较普通神经网络下降的快很多。
先前由于理解错误,导致get_meta_batch写错了。所以会造成过拟合的假象,现在已经修正过来了。
HI, I think there is a problem in code. Even if you set the meta-weights before computing gradients, model will still use the original weights to compute gradients. You can verify it using a same batch to compute loss gradients before and after setting the weights. I may be wrong but I have observed this behaviour. Can you please verify this?
@AnshThakur Thank for you review my code and tell me where bug.I will try to do this.However I am trouble with other project, I can't tell you the result right away. May be one to three week, I will fix it.
HI, I think there is a problem in code. Even if you set the meta-weights before computing gradients, model will still use the original weights to compute gradients. You can verify it using a same batch to compute loss gradients before and after setting the weights. I may be wrong but I have observed this behaviour. Can you please verify this?
I try your method to verify that meta-weight is reloaded.But the result is the two logits and loss gradients is total different.So sorry about that.
# Before load meta-weight
with tf.GradientTape() as tape:
logits = model(support_x)
loss = compute_loss(support_y, logits)
grads = tape.gradient(loss, model.trainable_variables)
print(grads[0])
# logits = model(tf.expand_dims(query_x[0], axis=0))
# print(logits)
model.set_weights(meta_weights)
# After reload meta-weight
# logits = model(tf.expand_dims(query_x[0], axis=0))
# print(logits)
with tf.GradientTape() as tape:
logits = model(support_x)
loss = compute_loss(support_y, logits)
grads = tape.gradient(loss, model.trainable_variables)
print(grads[0])
博主您好!请问在数据集上的正确率是多少?
博主您好!请问在数据集上的正确率是多少? 经过MAML训练的模型,稍微训练几步就可以达到70、80的准确率。 Model with maml weight train for 3 step, val loss: 0.8904, accuracy: 0.6700. Model with maml weight train for 5 step, val loss: 0.5034, accuracy: 0.7800. Model with maml weight train for 10 step, val loss: 0.2013, accuracy: 0.9500.
您好,请问一下您这个数据集是以什么结构设置的?,您这个数据处理的代码没有太看明白。