Heim > Fragen und Antworten > Hauptteil
In TensorFlow möchte ich ein logistisches Regressionsmodell mit der folgenden Kostenfunktion erstellen:
Der Screenshot des verwendeten Datensatzes sieht wie folgt aus:
Mein Code lautet wie folgt:
train_X = train_data[:, :-1]
train_y = train_data[:, -1:]
feature_num = len(train_X[0])
sample_num = len(train_X)
print("Size of train_X: {}x{}".format(sample_num, feature_num))
print("Size of train_y: {}x{}".format(len(train_y), len(train_y[0])))
X = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
W = tf.Variable(tf.zeros([feature_num, 1]))
b = tf.Variable([-.3])
db = tf.matmul(X, tf.reshape(W, [-1, 1])) + b
hyp = tf.sigmoid(db)
cost0 = y * tf.log(hyp)
cost1 = (1 - y) * tf.log(1 - hyp)
cost = (cost0 + cost1) / -sample_num
loss = tf.reduce_sum(cost)
optimizer = tf.train.GradientDescentOptimizer(0.1)
train = optimizer.minimize(loss)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
print(0, sess.run(W).flatten(), sess.run(b).flatten())
sess.run(train, {X: train_X, y: train_y})
print(1, sess.run(W).flatten(), sess.run(b).flatten())
sess.run(train, {X: train_X, y: train_y})
print(2, sess.run(W).flatten(), sess.run(b).flatten())
Der Screenshot der Laufergebnisse sieht wie folgt aus:
Sie können sehen, dass wir nach zwei Iterationen W
和b
都变成了nan
erhalten haben.
大家讲道理2017-06-28 09:25:45
经过一番搜索,找到了问题所在。
在选取迭代方式的那一句:
optimizer = tf.train.GradientDescentOptimizer(0.1)
这里0.1
的学习率过大,导致不知什么原因在损失函数中出现了log(0)
的情况,结果导致了损失函数的值为nan
,解决方法是减小学习率,比如降到1e-5
或者1e-6
就可以正常训练了,我根据自己的情况把学习率调整为了1e-3,程序完美运行。
附上最终拟合结果: