gpt4 book ai didi

Tensorflow - 损失开始很高并且不会减少

转载 作者:行者123 更新时间:2023-12-03 16:41:08 25 4
gpt4 key购买 nike

我开始使用 tensorflow 编写神经元网络,并且在我的每个示例项目中似乎都面临一个问题。

我的损失总是从 50 或更高开始,并且不会减少,或者如果减少,它的速度非常慢,以至于在我所有的时代之后,我什至没有接近可接受的损失率。

它已经尝试过的东西 (并没有对结果产生太大影响)

  • 测试过拟合,但在下面的例子中
    你可以看到我有 15000 个训练和 15000 个测试数据集和
    类似于 900 个神经元
  • 测试了不同的优化器和优化器值
  • 尝试使用 testdata 作为增加 traingdata
    培训数据以及
  • 尝试增加和减少批量

  • 我创建了知识网络 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 开始而不是更低?

    非常感谢你们!

    最佳答案

    0.69 nats 没什么问题每个样本的熵,作为二元分类的起点。

    如果转换为基数 2,0.69/log(2) ,您会看到每个样本几乎正好是 1 位,这正是您不确定二进制分类时所期望的。

    我通常使用平均损失而不是总和,所以事情对批量大小不太敏感。

    您也不应该直接自己计算熵,因为该方法很容易失效。您可能想要 tf.nn.sigmoid_cross_entropy_with_logits .

    我也喜欢从 Adam Optimizer 开始而不是纯梯度下降。

    以下是您可能遇到此问题的两个原因:

    1)字符代码是有顺序的,但是顺序不代表什么。如果您的输入作为单热向量输入,网络将更容易将其作为输入。所以你的输入将是一个 26x30 = 780 的元素向量。否则,网络必须浪费大量容量来学习字母之间的边界。

    2)您只有完全连接的层。这使得它无法独立于名称中的绝对位置来了解事实。 2015 年排名前 10 的女孩名字中有 6 个以“a”结尾,而排名前 10 的男孩名字中有 0 个以“a”结尾。正如目前所写,您的网络需要为每个名字长度独立地重新学习“通常它是一个女孩的名字,如果它以‘a’结尾”。使用一些卷积层将允许它在所有名称长度上学习一次事实。

    关于Tensorflow - 损失开始很高并且不会减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41259555/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com