Python TypeError:维度值必须为整数或无,或具有_索引_方法,获得了TensorShape([None,1])
我正在尝试将我发现的一个使用TFT的机器人教程转换为使用keras。现在的输出应该是模型预测的数据。但是,我得到了一个错误: TypeError:维度值必须为整数或无,或具有_索引_方法,Get TensorShape[None,1] 我的代码:Python TypeError:维度值必须为整数或无,或具有_索引_方法,获得了TensorShape([None,1]),python,tensorflow,keras,Python,Tensorflow,Keras,我正在尝试将我发现的一个使用TFT的机器人教程转换为使用keras。现在的输出应该是模型预测的数据。但是,我得到了一个错误: TypeError:维度值必须为整数或无,或具有_索引_方法,Get TensorShape[None,1] 我的代码: with open("intents.json") as file: data = json.load(file) try: with open("data.pickle", "rb") as f: words, lab
with open("intents.json") as file:
data = json.load(file)
try:
with open("data.pickle", "rb") as f:
words, lables, training, output = pickle.load(f)
except:
words = []
labels = []
docs_x = []
docs_y = []
for intent in data["intents"]:
for pattern in intent["patterns"]:
wrds = nltk.word_tokenize(pattern)
words.extend(wrds)
docs_x.append(wrds)
docs_y.append(intent["tag"])
if intent["tag"] not in labels:
labels.append(intent["tag"])
words = [stemmer.stem(w.lower()) for w in words if w != "?"]
words = sorted(list(set(words)))
labels = sorted(labels)
training = []
output = []
out_empty = [0 for _ in range(len(labels))]
for x, doc in enumerate(docs_x):
bag = []
wrds = [stemmer.stem(w) for w in doc]
# marks if a word is present in the input (1=yes, 0=no)
for w in words:
if w in wrds:
bag.append(1)
else:
bag.append(0)
output_row = out_empty[:]
output_row[labels.index(docs_y[x])] = 1
training.append(bag)
output.append(output_row)
training = numpy.array(training)
output = numpy.array(output)
with open("data.pickle", "wb") as f:
pickle.dump((words, labels, training, output), f)
tf.keras.backend.clear_session()
model = tf.keras.Sequential()
model.add(keras.layers.Dense(len(training[0])))
model.add(keras.layers.Dense(8))
model.add(keras.layers.Dense(8))
model.add(keras.layers.Dense(len(output[0]), activation="softmax"))
try:
keras.models.load_model("model.tflearn")
except:
model.compile(optimizer="adam", loss="categorical_crossentropy", metrics="accuracy")
model.fit(training, output, epochs=1000, batch_size=8)
model.save("model.tflearn")
def bag_of_words(s, words):
bag = [0 for _ in range(len(words))]
s_words = nltk.word_tokenize(s)
s_words = [stemmer.stem(word.lower()) for word in s_words]
for se in s_words:
for i, w in enumerate(words):
if w == se:
bag[i] = 1
return numpy.array(bag)
def chat():
print("Ready to chat! (type quit to stop)")
while True:
inp = input("You: ")
if inp.lower() == "quit":
break
results = model.predict([bag_of_words(inp, words)])
print(results)
chat()
使用调试模式时,它告诉我错误在聊天室的内部:
结果=模型。预测[bag_of_wordsinp,words]好的,所以这并不是你问题的100%答案,但我在谷歌搜索tf.2.2和tf.data.Dataset.from_生成器函数的同一问题时发现了它。由于我找到了tf代码中没有记录的解决方案,我想我会在这里发布它,让社区在将来看到。
输出_形状只需要与输出_类型相同数量的元素。也就是说,仅仅说所有的输出类型=tf.dtypes.float32是不够的,而是每个shapes元素都需要一个type元素,所以这并不是你问题的100%答案,但我在谷歌搜索tf.2.2和tf.data.Dataset.from_生成器函数的同一个问题时遇到了这个问题。由于我找到了tf代码中没有记录的解决方案,我想我会在这里发布它,让社区在将来看到。
输出_形状只需要与输出_类型相同数量的元素。也就是说,仅仅说所有输出类型=tf.dtypes.float32是不够的,而是每个形状元素都需要一个type元素,这也不是问题的确切答案,而是在同一行的某个地方相关。我得到了一个错误:TypeError:Dimension value必须是整数或无,或者有一个_index__方法,得到108.0,我最终发现如果生成器返回矩阵,那么它的形状值显然是整数,例如X.shape=64,16,108,192,3,其中X是从生成器返回的numpy矩阵。但您可能错误地将[64,16,108.0,192.0,3]作为tf.data.Dataset.from_生成器函数中的输出_形状参数传递,即浮点值108而不是整数。在输出形状中传递整数值为我解决了这个问题。把它留给社区。也不是这个问题的确切答案,而是在同一条线上的某个地方。我得到了一个错误:TypeError:Dimension value必须是整数或无,或者有一个_index__方法,得到108.0,我最终发现如果生成器返回矩阵,那么它的形状值显然是整数,例如X.shape=64,16,108,192,3,其中X是从生成器返回的numpy矩阵。但您可能错误地将[64,16,108.0,192.0,3]作为tf.data.Dataset.from_生成器函数中的输出_形状参数传递,即浮点值108而不是整数。在输出形状中传递整数值为我解决了这个问题。将其留给社区。不确定您是否仍然对答案感兴趣,因为已经有一段时间了。 然而,我在编写自定义keras层时遇到了同样的问题。 当我对图层的输入应该是张量,但我提供了一个包含单个元素的列表时,同样的错误也发生在我身上。 可能会取代
results = model.predict([bag_of_words(inp, words)])
借
由于已经有一段时间了,我不确定你是否仍然对答案感兴趣。 然而,我在编写自定义keras层时遇到了同样的问题。 当我对图层的输入应该是张量,但我提供了一个包含单个元素的列表时,同样的错误也发生在我身上。 可能会取代
results = model.predict([bag_of_words(inp, words)])
借
你会喜欢这个把戏吗