Tensorflow梯度为0,权重未更新

我在使用Keras一段时间后开始学习TensorFlow,并尝试构建一个用于CIFAR-10分类的卷积神经网络。然而,我认为我在TensorFlow API的理解上可能存在一些误解,因为即使是在一层网络模型中,权重也没有更新。

模型的代码如下:

num_epochs = 10 batch_size = 64# mu和std的形状是正确的:(1, 32, 32, 3)mu = np.mean(X_train, axis=0, keepdims=True)sigma = np.std(X_train, axis=0, keepdims=True)# 数据和归一化的占位符# (归一化没有帮助)data = tf.placeholder(np.float32, shape=(None, 32, 32, 3), name='data')labels = tf.placeholder(np.int32, shape=(None,), name='labels')data = (data - mu) / sigma# 展平flat = tf.reshape(data, shape=(-1, 32 * 32 * 3))dense1 = tf.layers.dense(inputs=flat, units=10)predictions = tf.nn.softmax(dense1)onehot_labels = tf.one_hot(indices=labels, depth=10)# 也尝试了sparse_softmax_cross_entropy_with_logitsloss = tf.losses.softmax_cross_entropy(onehot_labels=onehot_labels, logits=predictions)loss = tf.reduce_mean(loss)# 学习率无关紧要,因为权重没有更新!optimizer = tf.train.AdamOptimizer(learning_rate=0.01).minimize(loss)loss_history = []with tf.Session() as session:    tf.global_variables_initializer().run()    tf.local_variables_initializer().run()    for epochs in range(10):        print("Epoch:", epochs)        # 加载小批量数据-        for batch in iterate_minibatches(X_train.astype(np.float32)[:10], y_train[:10], 5):            inputs, target = batch            feed_dict = {data: inputs, labels: target}            loss_val, _ = session.run([loss, optimizer], feed_dict=feed_dict)            grads = tf.reduce_sum(tf.gradients(loss, dense1)[0])            grads = session.run(grads, {data: inputs, labels: target})            print("Loss:", loss_val, "Grads:", grads)

代码产生以下输出:

Epoch: 0Loss: 2.46115 Grads: -1.02031e-17Loss: 2.46041 Grads: 0.0Epoch: 1Loss: 2.46115 Grads: 0.0Loss: 2.26115 Grads: 0.0Epoch: 2Loss: 2.46115 Grads: 0.0Loss: 2.26115 Grads: 0.0Epoch: 3Loss: 2.46115 Grads: 0.0Loss: 2.26115 Grads: 0.0Epoch: 4Loss: 2.46115 Grads: 0.0Loss: 2.26115 Grads: 0.0Epoch: 5Loss: 2.46115 Grads: 0.0Loss: 2.26115 Grads: 0.0Epoch: 6Loss: 2.46115 Grads: 0.0Loss: 2.26115 Grads: 0.0Epoch: 7Loss: 2.46115 Grads: 0.0Loss: 2.26115 Grads: 0.0Epoch: 8Loss: 2.46115 Grads: 0.0Loss: 2.26115 Grads: 0.0Epoch: 9Loss: 2.46115 Grads: 0.0Loss: 2.26115 Grads: 0.0

看起来模型可能重置了其权重,或者完全停止了学习。我也尝试了稀疏softmax交叉熵损失,但没有任何帮助。


回答:

你在输出上应用了两次softmax,一次在tf.nn.softmax中,另一次在应用softmax_cross_entropy时。这可能会破坏网络的任何学习能力。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注