TypeError:维度值必须为整数或无,或具有_索引_方法,获得了TensorShape([None,1])

2024-05-16 01:51:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将我发现的一个使用TFT的机器人教程转换为使用keras。现在的输出应该是模型预测的数据。但是,我得到了一个错误:

TypeError:维度值必须为整数或无,或具有_索引_方法,获得了TensorShape([None,1])

我的代码:

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()

使用调试模式时,它会告诉我错误在以下行(chat()的内部):

结果=模型。预测([一袋一袋的单词(inp,单词)])


Tags: indocsforoutputlabelsmodeliftraining
3条回答

好的,这并不是你问题的100%答案,但我在用tf.2.2和tf.data.Dataset.from_generator函数搜索同一问题时发现了它。由于我找到了tf代码中没有记录的解决方案,我想我会在这里发布它,让社区在将来看到。 output_shapes只需要与output_types相同数量的元素。也就是说,仅仅说所有的output_types=tf.dtypes.float32是不够的,而是每个shapes元素需要一个type元素

不确定你是否仍然对答案感兴趣,因为已经有一段时间了。 然而,我在编写自定义keras层时遇到了同样的问题。 当我对图层的输入应该是张量,但我提供了一个列表(带有单个元素)时,我也发生了同样的错误。 可能会取代

    results = model.predict([bag_of_words(inp, words)])

    results = model.predict(bag_of_words(inp, words))

你会喜欢这个把戏吗

也不是对这个问题的确切答案,而是在同一条线上的某个地方。我得到了错误:TypeError: Dimension value must be integer or None or have an __index__ method, got 108.0,我最终发现,如果生成器返回矩阵,那么它的形状值显然是整数,例如X.shape = (64, 16, 108, 192, 3),其中X是从生成器返回的numpy矩阵。但您可能错误地将([64,16,108.0,192.0,3])作为tf.data.Dataset.from_generator函数中的output_shapes参数传递,即浮点值108而不是整数。在output_shapes中传递整数值为我解决了这个问题。把它留给社区

相关问题 更多 >