【问题标题】:Trouble with adding an extra layer to neural net in Tensorflow在 Tensorflow 中向神经网络添加额外层的问题
【发布时间】:2019-04-05 20:58:03
【问题描述】:

我正在尝试向我的神经网络添加第二个隐藏层,在 MNIST 数据集上进行训练。只有一个简单的隐藏层,训练效果很好,准确率稳步提高。

当我尝试添加第二层时,每次开始训练时,准确率都会停留在 0.117。只是无法弄清楚我在这里做错了什么?

我尝试将 sigmoid 添加到我的 y 中,但没有成功。

XTrain = XTrain[0:10000,:]
YTrain = YTrain[0:10000]

K = len(set(YTrain))
N = len(YTrain)
M = 12 #Hidden layer units
D = XTrain.shape[1]


tfX = tf.placeholder(tf.float32, [None, D])
tfY = tf.placeholder(tf.float32, [None, K])                    

# HIDDEN LAYER 1
W1 = tf.Variable(tf.random_normal([D,M], stddev=0.01))
b1 = tf.Variable(tf.random_normal([M], stddev=0.01))

# HIDDEN LAYER 2
W2 = tf.Variable(tf.random_normal([M,M], stddev=0.01))
b2 = tf.Variable(tf.random_normal([M], stddev=0.01))

# OUTPUT LAYER 
W3 = tf.Variable(tf.random_normal([M,K], stddev=0.01))
b3 = tf.Variable(tf.random_normal([K], stddev=0.01))

# MODEL
h1 = tf.nn.sigmoid(tf.matmul(tfX, W1) + b1)
h2 = tf.nn.sigmoid(tf.matmul(h1, W2) + b2)
y = tf.matmul(h2,W3) + b3

# Softmax and cross-entropy
cost = tf.reduce_mean(
  tf.nn.softmax_cross_entropy_with_logits_v2(
    labels = tfY,
    logits = y)
)

# Targets One-Hot encoded
T = np.zeros((N,K)) 
for i in range(N):
    T[i,YTrain[i]] = 1

#Gradient descent
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost)

predict_op = tf.argmax(y, 1)

# Start session and initialize variables
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

# TRAIN
for i in range(10000):
    sess.run(train_op, feed_dict={tfX: XTrain, tfY: T})
    pred = sess.run(predict_op, feed_dict={tfX: XTrain, tfY: T})
    if i % 20 == 0:
        print("Accuracy:", np.mean(YTrain == pred)) 

当我开始训练时,输出如下所示:

准确度:0.0991 精度:0.1127 精度:0.1127 精度:0.1127 精度:0.1127 精度:0.1127 精度:0.1127 精度:0.1127 精度:0.1127 精度:0.1127 精度:0.1127 精度:0.1127

【问题讨论】:

  • 输入数据的形状是什么?
  • Inputsize 是 784。但正如我试图解释的那样,它与单个隐藏层一起工作。这里唯一添加的是:W3、b3 和 h2
  • 为什么需要onehot?
  • 你试过降低学习率吗?
  • 我不太确定,我对 Tensorflow 还很陌生,但它应该可以与 one-hot 一起使用,不是吗? @borarak 是的,降至 0.0005。详细说明一下,这里的工作代码只是简单地超越了第二个隐藏层,它工作得非常好,而且准确性越来越高:W1 = tf.Variable(tf.random_normal([D,M], stddev=0.01))' 'b1 = tf.Variable(tf.random_normal([M], stddev=0.01))' 'W2 = tf.Variable(tf.random_normal([M,K], stddev=0.01))' 'b2 = tf.Variable(tf.random_normal([K], stddev=0.01))' 'h1 = tf.nn.sigmoid(tf.matmul(tfX, W1) + b1)' 'y = tf.matmul(h1,W2) + b2

标签: python tensorflow hidden layer


【解决方案1】:

我自己想出了解决问题的办法。

显然权重的初始化不正确。如果我将初始化更改为:

# HIDDEN LAYER 1
W1 = tf.Variable(tf.random_normal([D,M], stddev=1) / np.sqrt(D))
b1 = tf.Variable(tf.random_normal([M], stddev=1))

# HIDDEN LAYER 2
W2 = tf.Variable(tf.random_normal([M,M], stddev=1) / np.sqrt(M))
b2 = tf.Variable(tf.random_normal([M], stddev=1))

# OUTPUT LAYER 
W3 = tf.Variable(tf.random_normal([M,K], stddev=1) / np.sqrt(M))
b3 = tf.Variable(tf.random_normal([K], stddev=1))

为什么我仍然不太确定,希望得到任何答案和反馈。

【讨论】:

    猜你喜欢
    • 2022-06-22
    • 2018-11-05
    • 2015-10-24
    • 2020-06-01
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 2016-11-29
    • 2017-01-06
    相关资源
    最近更新 更多