如何为TFLearn创建validation_set?

时间:2018-08-24 04:39:45

标签: python tensorflow neural-network chatbot tflearn

我正在尝试为此聊天机器人教程创建一个验证集:Contextual Chatbots with Tensorflow

但是我的数据形状存在问题,这是我用来创建训练集和验证集的方法:

words = []
classes = []
documents = []
ignore_words = ['?']
# loop through each sentence in our intents patterns
for intent in intents['intents']:
    for pattern in intent['patterns']:
        # tokenize each word in the sentence
        w = nltk.word_tokenize(pattern)
        # add to our words list
        words.extend(w)
        # add to documents in our corpus
        documents.append((w, intent['tag']))
        # add to our classes list
        if intent['tag'] not in classes:
            classes.append(intent['tag'])

# stem and lower each word and remove duplicates
words = [stemmer.stem(w.lower()) for w in words if w not in ignore_words]
words = sorted(list(set(words)))

# remove duplicates
classes = sorted(list(set(classes)))


# create our training data
training = []
output = []
# create an empty array for our output
output_empty = [0] * len(classes)

# training set, bag of words for each sentence
for doc in documents:
    # initialize our bag of words
    bag = []
    # list of tokenized words for the pattern
    pattern_words = doc[0]
    # stem each word
    pattern_words = [stemmer.stem(word.lower()) for word in pattern_words]
    # create our bag of words array
    for w in words:
        bag.append(1) if w in pattern_words else bag.append(0)

    # output is a '0' for each tag and '1' for current tag
    output_row = list(output_empty)
    output_row[classes.index(doc[1])] = 1

    training.append([bag, output_row])

# shuffle our features and turn into np.array
random.shuffle(training)
training = np.array(training)

# create train and test lists
x = list(training[:,0])
y = list(training[:,1])

我使用不同的数据运行了两次,并获得了训练和验证集。问题是我用训练集的形状来启动我的张量流:

 net = tflearn.input_data(shape=[None, len(train_x[0])])

所以当我适合模型时:

model.fit(train_x, train_y, n_epoch=1000,snapshot_step=100, snapshot_epoch=False, validation_set=(val_x,val_y), show_metric=True)

我收到此错误:

  

ValueError:无法为张量为'(?,84)'的张量'InputData / X:0'输入形状(23,55)的值

其中23个是问题的数量,而55个是我的验证集的唯一单词的数量。 84是训练集中唯一词的数量。

由于我的验证集与训练集中的问题/唯一单词的数量不同,所以我无法验证我的训练。

有人可以帮助我创建一个有效的验证集吗?我是Tensorflow和Tflearn的新手,所以任何帮助都很棒。

1 个答案:

答案 0 :(得分:0)

据我所知,这就是您所做的:创建了一个名为words的字典,其中包含数据集中的所有可能单词。然后,在创建训练数据集时,您在该字典question中搜索words的每个单词,如果存在,则将1添加到单词包中,否则将0添加到单词包中。这里的问题是,每个问题将具有不同数量的单词,因此1's0's的数量也不同。

您可以通过执行相反的操作来解决此问题:在该训练集中的问题中搜索字典words的每个单词,如果存在,则将1添加到您的单词包中,然后{{ 1}}否则。这样,所有问题都将具有相同的长度(=字典0的长度)。您的训练集现在将具有维度words

验证集也可以做同样的事情:在验证集的问题中搜索字典(num_of_questions_in_training, len(words)的每个单词,如果存在,则将words添加到您的单词包中,然后{{1 }} 除此以外。同样,通过这种方式,您的验证集现在将具有维度1,从而解决了维度不匹配的问题。

因此,假设0中有90个单词,training_set_shape:(num_of_questions_in_validation, len(words),validation_set_shape:words