在TensorFlow中实现简单的Softmax分类器

我正在尝试用TensorFlow编写一个简单的Softmax分类器。

以下是代码:

# Neural network parametersn_hidden_units = 500n_classes = 10# training set placeholdersinput_X = tf.placeholder(dtype='float32',shape=(None,X_train.shape[1], X_train.shape[2]),name="input_X")input_y = tf.placeholder(dtype='int32', shape=(None,), name="input_y")# hidden layerdim = X_train.shape[1]*X_train.shape[2] # dimension of each traning data pointflatten_X = tf.reshape(input_X, shape=(-1, dim))weights_hidden_layer = tf.Variable(initial_value=np.zeros((dim,n_hidden_units)), dtype ='float32')bias_hidden_layer = tf.Variable(initial_value=np.zeros((1,n_hidden_units)), dtype ='float32')hidden_layer_output = tf.nn.relu(tf.matmul(flatten_X, weights_hidden_layer) + bias_hidden_layer)# output layerweights_output_layer = tf.Variable(initial_value=np.zeros((n_hidden_units,n_classes)), dtype ='float32')bias_output_layer = tf.Variable(initial_value=np.zeros((1,n_classes)), dtype ='float32')output_logits = tf.matmul(hidden_layer_output, weights_output_layer) + bias_output_layerpredicted_y = tf.nn.softmax(output_logits)# lossone_hot_labels = tf.one_hot(input_y, depth=n_classes, axis = -1)loss = tf.losses.softmax_cross_entropy(one_hot_labels, output_logits)# optimizeroptimizer = tf.train.MomentumOptimizer(0.01, 0.5).minimize(    loss, var_list=[weights_hidden_layer, bias_hidden_layer, weights_output_layer, bias_output_layer])

这段代码可以编译,并且我已经检查了所有张量的形状,它们与我预期的一致。

然而,当我尝试使用以下代码运行优化器时:

# running the optimizers = tf.InteractiveSession()s.run(tf.global_variables_initializer())for i in range(5):    s.run(optimizer, {input_X: X_train, input_y: y_train})    loss_i = s.run(loss, {input_X: X_train, input_y: y_train})print("loss at iter %i:%.4f" % (i, loss_i))

损失值在所有迭代中保持不变!

我一定是搞错了什么,但我不明白是哪里出了问题。

有什么想法吗?如果有人能就代码风格和/或TensorFlow技巧发表评论,我也会很感激的。


回答:

你犯了一个错误。你使用np.zeros来初始化权重。应该使用np.random.normal。你可以根据进入特定神经元的输入数量来选择这个高斯分布的mean。你可以在这里阅读更多相关信息

你希望使用高斯分布来初始化的原因是想要打破对称性。如果所有权重都初始化为zero,那么通过反向传播可以看出所有权重将以相同的方式演变。

Related Posts

Keras Dense层输入未被展平

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

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

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

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

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

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

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

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

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

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

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

发表回复

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