【问题标题】:Simple softmax classifier in tensorflow张量流中的简单softmax分类器
【发布时间】:2018-11-27 15:08:51
【问题描述】:

所以我正在尝试在 TensorFlow 中编写一个简单的 softmax 分类器。

代码如下:

# Neural network parameters
n_hidden_units = 500
n_classes = 10

# training set placeholders
input_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 layer
dim = X_train.shape[1]*X_train.shape[2] # dimension of each traning data point
flatten_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 layer
weights_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_layer
predicted_y = tf.nn.softmax(output_logits)

# loss
one_hot_labels = tf.one_hot(input_y, depth=n_classes, axis = -1)
loss = tf.losses.softmax_cross_entropy(one_hot_labels, output_logits)

# optimizer
optimizer = 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 optimizer
s = 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))

并且损失在所有迭代中都保持不变!

我一定是搞砸了什么,但我看不出是什么。

有什么想法吗?如果有人离开 cmets 关于代码样式和/或 tensorflow 提示,我也很感激。

【问题讨论】:

    标签: tensorflow machine-learning classification softmax cross-entropy


    【解决方案1】:

    你犯了一个错误。您正在使用np.zeros 初始化您的权重。使用np.random.normal。您可以通过使用进入特定神经元的输入数量为此高斯分布选择mean。你可以阅读更多关于它的信息here

    你想用高斯分布初始化的原因是你想打破对称性。如果所有权重都由zero 初始化,那么您可以使用反向传播来查看所有权重的演化过程相同。

    【讨论】:

    • 我刚刚使用反向传播进行了检查,发现当权重为零时,所有梯度都为零,这就是为什么你的损失在所有迭代中都是相同的。
    【解决方案2】:

    可以使用 TensorBoard 将权重直方图可视化以使其更容易。我为此执行了你的代码。需要多几行来设置 Tensorboard 日志记录,但可以轻松添加权重的直方图摘要。

    初始化为零

    weights_hidden_layer = tf.Variable(initial_value=np.zeros((784,n_hidden_units)), dtype ='float32')
    tf.summary.histogram("weights_hidden_layer",weights_hidden_layer)
    

    Xavier 初始化

    initializer = tf.contrib.layers.xavier_initializer()
    weights_hidden_layer = tf.Variable(initializer(shape=(784,n_hidden_units)), dtype ='float32')
    tf.summary.histogram("weights_hidden_layer",weights_hidden_layer)
    

    【讨论】:

      猜你喜欢
      • 2017-10-29
      • 1970-01-01
      • 2017-01-09
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 2017-09-11
      相关资源
      最近更新 更多