- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试在 keras 中制作一个聊天机器人。我为词汇表中的每个词分配了自己的 ID。一个训练样本如下所示:
[0 0 0 0 0 0 32 328 2839 13 192 1 ] -> [23 3289 328 2318 12 0 0 0 0 0 0 0]
然后我使用 Keras 中的嵌入层将这些 ID 嵌入到大小为 32 的向量中。然后我使用 LSTM 层作为隐藏层。问题是我的输出是一个嵌入式 ID 的列表。
[ 0.16102183 0.1238187 0.1159694 0.13688719 0.12964118 0.12848872
0.13515817 0.13582146 0.16919741 0.15453722 ...]
如何将这些嵌入转换回我原始词汇表中的单词?
这是我的代码:
from nltk.tokenize import word_tokenize
from sklearn.feature_extraction.text import CountVectorizer
from keras.models import Sequential, load_model
from keras.layers import LSTM
from keras.layers.embeddings import Embedding
from keras.preprocessing import sequence
import os
import numpy as np
import cPickle as pickle
class Chatbot(object):
def __init__(self, h_layers=1):
# self.name = name
self.h_layers = h_layers
self.seq2seq = None
self.max_length = 0
self.vocabulary = {}
@staticmethod
def load(model_name):
with open('models/{}/chatbot_object.pkl'.format(model_name), 'rb') as pickle_file:
obj = pickle.load(pickle_file)
obj.seq2seq = load_model('models/{}/seq2seq.h5'.format(model_name))
return obj
def train(self, x_train, y_train):
count_vect = CountVectorizer()
count_vect.fit(x_train)
count_vect.fit(y_train)
self.vocabulary = count_vect.vocabulary_
self.vocabulary.update({'<START>': len(self.vocabulary),
'<END>': len(self.vocabulary) + 1,
'<PAD>': len(self.vocabulary) + 2,
'<UNK>': len(self.vocabulary) + 3})
for i in range(len(x_train)):
x_train[i] = ['<START>'] + [w.lower() for w in word_tokenize(x_train[i])] + ['<END>']
for i in range(len(y_train)):
y_train[i] = ['<START>'] + [w.lower() for w in word_tokenize(y_train[i])] + ['<END>']
for sample in x_train:
if len(sample) > self.max_length:
self.max_length = len(sample)
for sample in y_train:
if len(sample) > self.max_length:
self.max_length = len(sample)
for i in range(len(x_train)):
x_train[i] = [self.vocabulary[w] for w in x_train[i] if w in self.vocabulary]
for i in range(len(y_train)):
y_train[i] = [self.vocabulary[w] for w in y_train[i] if w in self.vocabulary]
x_train = sequence.pad_sequences(x_train, maxlen=self.max_length, value=self.vocabulary['<PAD>'])
y_train = sequence.pad_sequences(y_train, maxlen=self.max_length, padding='post',
value=self.vocabulary['<PAD>'])
x_train = np.asarray(x_train)
y_train = np.asarray(y_train)
embedding_vector_length = 32
self.seq2seq = Sequential()
self.seq2seq.add(Embedding(len(self.vocabulary), embedding_vector_length, input_length=self.max_length))
for _ in range(self.h_layers):
self.seq2seq.add(LSTM(self.max_length, return_sequences=True))
self.seq2seq.add(LSTM(self.max_length))
self.seq2seq.compile(loss='cosine_proximity', optimizer='adam', metrics=['accuracy'])
self.seq2seq.fit(x_train[:100], y_train[:100], epochs=5, batch_size=32)
def save(self, filename):
if filename not in os.listdir('models'):
os.system('mkdir models/{}'.format(filename))
self.seq2seq.save('models/{}/seq2seq.h5'.format(filename))
self.seq2seq = None
with open('models/{}/chatbot_object.pkl'.format(filename), 'wb') as pickle_file:
pickle.dump(self, pickle_file)
def respond(self, text):
tokens = ['<START>'] + [w.lower() for w in word_tokenize(text)] + ['<END>']
for i in range(len(tokens)):
if tokens[i] in self.vocabulary:
tokens[i] = self.vocabulary[tokens[i]]
else:
tokens[i] = self.vocabulary['<PAD>']
x = sequence.pad_sequences([tokens], maxlen=self.max_length, value=self.vocabulary['<PAD>'])
prediction = self.seq2seq.predict(x, batch_size=1)
return prediction[0]
最佳答案
嵌入层像密集层一样工作,没有偏差或激活,只是经过优化。输入是一个单热向量(实际上它是一个整数,尽管从概念上讲它最初被转换为一个单热),输出是一个密集向量。由于此 embedding_layer.weights[0]
返回矩阵,它将与 one-hot 向量相乘。这意味着如果你调用 tf.linalg.pinv(embedding_layer.weights[0])
你应该得到一个矩阵,当乘以嵌入向量时,产生单热向量(tf .linalg.pinv
是矩阵的 Moore 伪逆)因此,嵌入的逆将是 tf.linalg.matmul(embedded_vector,tf.linalg.pinv(embedding_layer.weights[0] ))
这会产生词汇表长度的向量。然后,您可能希望通过 softmax 函数 (tf.nn.softmax
) 生成每个单词的概率分布。
关于python - keras中的反向词嵌入 - python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45773660/
我能否获得一个具有两个参数的递归Prolog谓词,称为反向,它返回列表的反向: 示例查询和预期结果: α-反向([a,b,c],L)。 L = [c,b,a]。 由两个称为palindrome的参数组
在使用 get_dummies() 将分类数据转换为数字数据后,我的数据框看起来像这样 score1 score2 country_CN country _AU category_leader ca
我有一张 table ,上面有一个国家/地区列表。说这些国家之一是“马其顿” 如果搜索“马其顿共和国”,什么 SQL 查询会返回“马其顿”记录? 我相信在 linq 中它会是这样的 var count
我们有一个角色继承结构,它假设每个人都默认获得最低级别的角色,而不是最高级别的过滤,如下图所示: role.Everyone //lowest level; everyone gets this ro
我正在使用 $.each() 解析数组,但在其中,我使用 .splice() 方法,因此我需要向后迭代。这可能吗? var store = [...]; //... var rules = [...]
我有一个 SPLObjectStorage 对象,其中 Player 对象作为键,分数作为与之关联的信息。玩家对象按照从最高分到最低分的顺序添加到存储中,但我现在需要以相反的顺序遍历它们。 我还需要能
我无法理解这一点:如果我给 Prolog reverse([], A). 它工作得很好,如果我给它 reverse(A, [] ). 并根据第一个建议回答 ; 它挂起!为什么? (GNU Prolog
我有一个 SPLObjectStorage 对象,其中 Player 对象作为键,分数作为与之关联的信息。玩家对象按照从最高分到最低分的顺序添加到存储中,但我现在需要以相反的顺序遍历它们。 我还需要能
我有一个HashMap看起来像: HashMap playerHashMap = new HashMap<>(); 玩家是包含姓名、号码、年龄等的对象。 现在我已经对它进行了排序,它看起来像这样: k
我有这个: file://localhost/Volumes/Untitled%20RAID%20Set%201/Callum/iTunes/Music/Steppenwolf/Steppenwolf
我正在使用 std::regex 并希望找到与某个用户定义的正则表达式字符串匹配的字符串中的最后一个位置。 例如,给定正则表达式 :.* 和字符串“test:55:last”,我想找到“:last”,
有一个表 ServErog(服务),它被重新引导到 4 个表 ServA、ServB、ServC、ServD(它们是不同的非统一服务),其中包含 servtype(服务类型)和 type_id(来自其
这个问题在这里已经有了答案: What is the best way to convert date from JavaScript string in format YYYYMMDD to Ja
我知道如何获得包含几个词的所有结果: SELECT * FROM `table` WHERE MATCH (`row`) AGAINST ('+word1 +word2' IN BOOLEAN MOD
你好,我有这个 html 代码: .container{ width: 450; height: 400; border:1px solid
我想知道是否有任何方法可以使用相同的 CSS 过渡实例来将其向前移动然后向后/向后移动。例如,假设我有这种转变: @-webkit-keyframes fade-transition { fr
假设我有这些字符串: char ref[30] = "1234567891234567891"; char oth[30] = "1234567891234567891"; 我想在 C++ 中使用 S
所以我有这段代码,它使 xcode 崩溃 void strrev(const std::string& str) { for(size_t i=str.length();i>=0;i--)
我正在使用下面的代码使每张图片 1 对 1 淡入淡出。我怎样才能反向执行此操作以使图片以相反的顺序加载? img {display:none;} $('img').each(function(
我正在尝试弄清楚如何改变 FrameLayout 堆叠其子项的方式。 目前它是最新的(先进先出)。我想更改它,使最新的 child 位于底部(FILO)。我试着查看 FrameLayout 的源代码,
我是一名优秀的程序员,十分优秀!