首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tape.gradient()和TF keras ()给出了不同的结果

tape.gradient()和TF keras ()给出了不同的结果
EN

Stack Overflow用户
提问于 2020-08-08 12:29:53
回答 1查看 462关注 0票数 1

我有一个使用keras函数API构建的模型。在定义它之后,我使用SGD优化器编译它,如下所示。

代码语言:javascript
复制
opt = tf.keras.optimizers.SGD(learning_rate=0.05, momentum=0.9, decay=1e-3,clipnorm=1)
model.compile(optimizer=opt, loss='mse')
model.fit(train_datagen, epochs=50,shuffle=True,verbose=True)

这可以很好地工作,并且我的模型会像预期的那样收敛。

然而,当我使用TF的磁带梯度实现相同的功能时,我总是得到NaN梯度,这导致我的权重等于NaN,随后我的损失函数值因为NaN而相等。下面是我使用的代码:

代码语言:javascript
复制
opt = tf.keras.optimizers.SGD(learning_rate=0.05, momentum=0.9, decay=1e-3,clipnorm=1)
loss_fn = tf.keras.losses.MeanSquaredError()

epochs = 50

for epoch in range(epochs):
        
    batch_list = list(range(len(train_datagen)))
    random.shuffle(batch_list)

    running_loss = 0
    
    for ii in batch_list:
        x,y_true = train_datagen[ii]
        
        with tf.GradientTape() as tape:
            y_pred = model(x, training=True)
            loss_value = loss_fn(y_true,y_pred)
            
        grads = tape.gradient(loss_value, model.trainable_variables)
        opt.apply_gradients(zip(grads, model.trainable_variables))
        
        running_loss += loss_value
    
    print('Epoch',epoch,'Running Loss:',running_loss.numpy()/len(batch_list))

我写的代码是否等同于Keras的model.fit()功能?由于某种原因,当我使用上面的代码时,我总是得到NaN渐变,但使用model.fit()时,这种情况永远不会发生。

EN

回答 1

Stack Overflow用户

发布于 2020-08-08 14:53:13

我认为这是因为基于类的损失MeanSquaredError需要在.fit方法之外进行一些额外的修补工作。取而代之的是,使用函数式的来使它更容易。就像这样在训练步骤中调用它。

代码语言:javascript
复制
with tf.GradientTape() as tape:
    y_pred = model(x, training=True)
    loss_value = tf.keras.losses.mean_squared_error(y_true,y_pred)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63311817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档