如何为 TFLearn 创建 validation_set?
How to create a validation_set for TFLearn?
我正在尝试为这个聊天机器人教程创建一个 validation_set: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: Cannot feed value of shape (23, 55) for Tensor 'InputData/X:0', which has shape '(?, 84)'
其中 23 是问题数,55 是我的验证集的唯一单词数。而84是训练集中唯一单词的数量。
因为我的验证集与我的训练集有不同数量的 questions/unique 个单词,所以我无法验证我的训练。
有人可以帮我创建一个独立于问题数量的有效验证集吗?我是 Tensorflow 和 Tflearn 的新手,所以任何帮助都会很棒。
据我所知,这就是您所做的:您创建了一个名为 words
的字典,其中包含数据集中所有可能的单词。然后在创建训练数据集时,您在该词典 words
中搜索 question
的每个单词,如果它在那里,您将 1
添加到您的词袋中,否则添加 0
.这里的问题是每个问题都会有不同数量的单词,因此 1's
和 0's
.
的数量也不同
你可以通过做相反的事情来绕过它:在那个训练集问题中搜索字典 words
的每个单词,如果它在那里,将 1
添加到你的词袋中,然后0
否则。这样所有的问题都会变成相同的长度(=字典的长度words
)。您的训练集现在将具有维度 (num_of_questions_in_training, len(words)
。
对于验证集也可以做同样的事情:在验证集的那个问题中搜索字典 words
的每个单词,如果它在那里,将 1
添加到你的词袋和 0
否则。同样,通过这种方式,您的验证集现在将具有维度 (num_of_questions_in_validation, len(words)
,这解决了维度不匹配的问题。
所以假设 words
中有 90 个单词,training_set_shape: (?,90)
, validation_set_shape: (23,90)
.
我正在尝试为这个聊天机器人教程创建一个 validation_set: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: Cannot feed value of shape (23, 55) for Tensor 'InputData/X:0', which has shape '(?, 84)'
其中 23 是问题数,55 是我的验证集的唯一单词数。而84是训练集中唯一单词的数量。
因为我的验证集与我的训练集有不同数量的 questions/unique 个单词,所以我无法验证我的训练。
有人可以帮我创建一个独立于问题数量的有效验证集吗?我是 Tensorflow 和 Tflearn 的新手,所以任何帮助都会很棒。
据我所知,这就是您所做的:您创建了一个名为 words
的字典,其中包含数据集中所有可能的单词。然后在创建训练数据集时,您在该词典 words
中搜索 question
的每个单词,如果它在那里,您将 1
添加到您的词袋中,否则添加 0
.这里的问题是每个问题都会有不同数量的单词,因此 1's
和 0's
.
你可以通过做相反的事情来绕过它:在那个训练集问题中搜索字典 words
的每个单词,如果它在那里,将 1
添加到你的词袋中,然后0
否则。这样所有的问题都会变成相同的长度(=字典的长度words
)。您的训练集现在将具有维度 (num_of_questions_in_training, len(words)
。
对于验证集也可以做同样的事情:在验证集的那个问题中搜索字典 words
的每个单词,如果它在那里,将 1
添加到你的词袋和 0
否则。同样,通过这种方式,您的验证集现在将具有维度 (num_of_questions_in_validation, len(words)
,这解决了维度不匹配的问题。
所以假设 words
中有 90 个单词,training_set_shape: (?,90)
, validation_set_shape: (23,90)
.