我开始用 tensorflow 编写神经网络,在我的每个示例项目中我似乎都面临一个问题。
我的损失总是从 50 或更高开始,并且不会减少,或者如果减少,它会非常缓慢,以至于在我的所有时期之后,我什至没有接近可接受的损失率。
它已经尝试过的事情(并且对结果没有太大影响)
- 过拟合测试,但在下面的示例中,您可以看到我有 15000 个训练和 15000 个测试数据集以及类似 900 个神经元
- 测试了不同的优化器和优化器值
- 尝试通过使用测试数据作为训练数据来增加训练数据
- 尝试增加和减少批大小
我根据https://youtu.be/vq2nnJ4g6N0的知识创建了网络
但是让我们看看我的一个测试项目:
我有一个名字列表,想假设性别,所以我的原始数据如下所示:
names=["Maria","Paul","Emilia",...]
genders=["f","m","f",...]
为了将其输入网络,我将名称转换为 charCodes 数组(期望最大长度为 30),并将性别转换为位数组
names=[[77.,97. ,114.,105.,97. ,0. ,0.,...]
[80.,97. ,117.,108.,0. ,0. ,0.,...]
[69.,109.,105.,108.,105.,97.,0.,...]]
genders=[[1.,0.]
[0.,1.]
[1.,0.]]
我为输出层构建了具有 3 个隐藏层 [30,20]、[20,10]、[10,10] 和 [10,2] 的网络。所有隐藏层都有一个 ReLU 作为激活函数。输出层有一个softmax。
# Input Layer
x = tf.placeholder(tf.float32, shape=[None, 30])
y_ = tf.placeholder(tf.float32, shape=[None, 2])
# Hidden Layers
# H1
W1 = tf.Variable(tf.truncated_normal([30, 20], stddev=0.1))
b1 = tf.Variable(tf.zeros([20]))
y1 = tf.nn.relu(tf.matmul(x, W1) + b1)
# H2
W2 = tf.Variable(tf.truncated_normal([20, 10], stddev=0.1))
b2 = tf.Variable(tf.zeros([10]))
y2 = tf.nn.relu(tf.matmul(y1, W2) + b2)
# H3
W3 = tf.Variable(tf.truncated_normal([10, 10], stddev=0.1))
b3 = tf.Variable(tf.zeros([10]))
y3 = tf.nn.relu(tf.matmul(y2, W3) + b3)
# Output Layer
W = tf.Variable(tf.truncated_normal([10, 2], stddev=0.1))
b = tf.Variable(tf.zeros([2]))
y = tf.nn.softmax(tf.matmul(y3, W) + b)
现在计算损失、准确率和训练操作:
# Loss
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
# Accuracy
is_correct = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
# Training
train_operation = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
我以 100 个批次训练网络
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(150):
bs = 100
index = i*bs
inputBatch = inputData[index:index+bs]
outputBatch = outputData[index:index+bs]
sess.run(train_operation, feed_dict={x: inputBatch, y_: outputBatch})
accuracyTrain, lossTrain = sess.run([accuracy, cross_entropy], feed_dict={x: inputBatch, y_: outputBatch})
if i%(bs/10) == 0:
print("step %d loss %.2f accuracy %.2f" % (i, lossTrain, accuracyTrain))
我得到以下结果:
step 0 loss 68.96 accuracy 0.55
step 10 loss 69.32 accuracy 0.50
step 20 loss 69.31 accuracy 0.50
step 30 loss 69.31 accuracy 0.50
step 40 loss 69.29 accuracy 0.51
step 50 loss 69.90 accuracy 0.53
step 60 loss 68.92 accuracy 0.55
step 70 loss 68.99 accuracy 0.55
step 80 loss 69.49 accuracy 0.49
step 90 loss 69.25 accuracy 0.52
step 100 loss 69.39 accuracy 0.49
step 110 loss 69.32 accuracy 0.47
step 120 loss 67.17 accuracy 0.61
step 130 loss 69.34 accuracy 0.50
step 140 loss 69.33 accuracy 0.47
我究竟做错了什么?
为什么它在我的项目中从 ~69 开始而不是更低?
非常感谢你们!