代码之家  ›  专栏  ›  技术社区  ›  Jsevillamol

tensorflow中的简单softmax分类器

  •  0
  • Jsevillamol  · 技术社区  · 8 年前

    所以我试图用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))
    

    在所有的迭代中损失都是一样的!

    我一定弄糟了什么,但我看不出来。

    有什么想法吗?如果有人留下关于代码风格和/或tensorflow技巧的评论,我也很感激。

    2 回复  |  直到 8 年前
        1
  •  1
  •   Abhishek Mishra    8 年前

    你犯了个错误。你正在初始化你的重量使用 np.zeros . 使用 np.random.normal . 你可以选择 mean 对于这种高斯分布,使用到特定神经元的输入数目。你可以读到更多 here .

    要使用高斯分布初始化的原因是要破坏对称性。如果所有权重都由 zero ,然后您可以使用backpropogation来查看所有权重的演变是否相同。

        2
  •  1
  •   Mohan Radhakrishnan    8 年前

    可以使用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)
    

    enter image description here

    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)
    

    enter image description here