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

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

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