【问题标题】:Tensorflow DNNClassifier return wrong predictionTensorflow DNNClassifier 返回错误的预测
【发布时间】:2016-08-02 15:53:42
【问题描述】:

我尝试像官方网站tf.contrib.learn Quickstart 的示例一样使用tensorflow 制作句子分类器,但使用我自己的数据,首先我通过使用字典将我所有的数据(它们是不同长度的字符串)转换为id然后将每个句子转换成一个整数数组。

每条训练记录都有自己指定的标签。

问题在于预测并不准确,只有一些,但其他一些即使输入等于训练基地的记录,结果也是错误的。
我的代码如下所示:

def launchModelData(values, labels, sample, actionClasses):

    #Tensor for trainig data
    v = tf.Variable(values)
    l = tf.Variable(labels)

    #Data Sample
    s = tf.Variable(sample)

    # Build 3 layer DNN with 10, 20, 10 units respectively.
    classifier = tf.contrib.learn.DNNClassifier(hidden_units=[10, 20, 10], n_classes=actionClasses)

    # Add an op to initialize the variables.
    init_op = tf.initialize_all_variables()

    # Later, when launching the model
    with tf.Session() as sess:
        # Run the init operation.
        sess.run(init_op)

        # Fit model.
        classifier.fit(x=v.eval(), y=l.eval(), steps=200)

        # Classify one new sample.
        new_sample = np.array(s.eval(), dtype=int)
        y = classifier.predict(new_sample)
        print ('Predictions: {}'.format(str(y)))

    return y

值和类示例:

[0 1] 0  
[0 2] 0  
[0 4] 0  
[7 8] 1  
[7 9] 1  
[ 7 13] 1  
[14 15] 2  
[14 16] 2  
[14 18] 2  
[20 21] 3  
[26 27] 5  
[29 27] 5  
[31 32] 5  
... 

我是 tensorflow 的新手,所以我尽量降低它的复杂性,欢迎任何帮助。

编辑
我的实际训练数据是this.

我尝试了 8 个类并且预测很好,所以也许我需要一个更大的语料库,我会尝试在新的编辑中显示我的输出。

EDIT2

现在我使用五层 [n,2n,4n,8n,16n] 的组合,其中 n = 类和步骤 = 20000,这可以很好地减少损失并提高准确度,但它再次只适用于几个目标(大约 10 个)预测错误的数量越大。

【问题讨论】:

  • 首先,神经网络不存储训练数据的快照。所以你不应该期望经过训练的网络甚至会为训练数据输出正确的标签。这些问题通常是由于训练数据不足而出现的。您是否尝试过使用更大的训练集?如果您需要进一步的帮助,请分享您的训练集的链接。
  • data 这是我的数据,你认为我需要更多数据吗?我使用较小的集合尝试相同的代码,例如 60 个样本(值)和 8 个类(目标)。而且预测很好,所以我在想,当有更多的类(目标)时,我可能需要更多的数据。感谢您的帮助!
  • 输入只有两个字?
  • 在这种情况下是的,我改变了将句子与其他相同长度的句子进行比较的过程,所以在这个例子中我减少了,现在我可以用相同大小的数组训练模型。跨度>

标签: python machine-learning nlp tensorflow deep-learning


【解决方案1】:

tf.learn 中的 Estimator 负责创建会话和图表。它通过 input_fn 获取输入张量。每个拟合/评估/预测都会创建一个新的会话和图表。代码应类似于以下内容:

# Build 3 layer DNN with 10, 20, 10 units respectively.
my_feature = tf.contrib.layers.real_valued_column('my_feature')
classifier = tf.contrib.learn.DNNClassifier(feature_columns=[my_feature], hidden_units=[10, 20, 10], n_classes=actionClasses)

def _my_train_data():
  return {'my_feature': tf.constant(values), tf.constant(labels)

classifier.fit(input_fn=_my_train_data, steps=200)

# Classify one new sample.
def _my_predict_data():
  return {'my_feature': tf.Constant(s)
y = classifier.predict(input_fn=_my_predict_data)
print ('Predictions: {}'.format(str(y)))

return y

【讨论】:

  • hmm 我完全不明白return {'my_feature': tf.constant(values), tf.constant(labels)} 这一行,因为我尝试使用你们中的一些代码,但下一行给我一个错误:需要多个值才能在classifier.fit(input_fn=_my_train_data, steps=200) 中解压。顺便感谢您的帮助。
  • 我将其更改为return {'my_feature': tf.constant(values)}, tf.constant(labels),但下一行给我一个错误:Cannot reshape a tensor with 250 elements to shape [125, 1]。
【解决方案2】:

毕竟我对代码进行了一些更改,但根本没有任何进展,所以我更改了 DNN 分类器的参数并增加了我的语料库的大小,它可以工作。

最后这是我的参数 aprox:
-步数 = 25000+
-层 = [n/2,n,n*2,n*4,n*8]
* n = 数量类
- 语料库大小 = 30000 个样本
- 数量类= 40

因此,这样做的损失等于 0.0945... 和准确度 = 0.896...,不知道这样做是否可以帮助某人,但它对我有用。

【讨论】:

    猜你喜欢
    • 2017-04-03
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 2019-12-31
    相关资源
    最近更新 更多