训练word2vec词向量文本分类模型时报Expected float64错误如何解决
错误原因
- 核心错误是自定义tf.keras.Model子类时错误使用Input层:tf.keras.Model子类的实现逻辑中,call方法会直接接收外部传入的输入张量,不需要在类内部定义Input层,Input层是Keras函数式API的专属写法。你在call中执行
x = self.inpu(x)时,相当于把训练数据text_train强行传入Input层做参数校验,触发了类型不匹配错误。 - 次要问题是Input层参数格式不规范:你定义Input层时写的
shape=100不符合要求,shape参数需要传入元组,单维度输入应写为shape=(100,)。 - 额外潜在问题:你提到输入是word2vec处理好的词向量,但Embedding层的作用是把整数索引映射为词向量,若你传入的
text_train已经是浮点型的词向量张量,不需要再走Embedding层,也会导致类型/维度不匹配。
解决方法
根据你的输入数据类型选择对应修改方案:
场景1:text_train是词的整数索引(需要走Embedding层映射为词向量)
修改模型代码,删除内部的Input层定义,调整后代码如下:
class TextNet(tf.keras.Model): def __init__(self, vocab_dim, n_symbols, embedding_weights, input_length): super(TextNet, self).__init__() self.embedding = Embedding(output_dim=vocab_dim, input_dim=n_symbols, mask_zero=True, weights=[embedding_weights], input_length=input_length, trainable=False) self.lstm = LSTM(64, activation='relu') self.dropout1 = Dropout(0.2) self.dense = Dense(512, activation='relu') self.dropout2 = Dropout(0.2) self.dense1 = Dense(38, activation='softmax') def call(self, x, **kwargs): x = self.embedding(x) x = self.lstm(x) x = self.dropout1(x) x = self.dense(x) x = self.dropout2(x) x = self.dense1(x) return x
修改完成后检查text_train:确保是整数类型的张量/数组,每个元素对应词表的索引值,最大值不超过n_symbols-1,shape为(样本数, input_length)。
场景2:text_train已经是word2vec处理好的浮点型词向量
直接删除Embedding层,不需要做索引到向量的映射,调整代码如下:
class TextNet(tf.keras.Model): def __init__(self, vocab_dim, input_length): super(TextNet, self).__init__() self.lstm = LSTM(64, activation='relu') self.dropout1 = Dropout(0.2) self.dense = Dense(512, activation='relu') self.dropout2 = Dropout(0.2) self.dense1 = Dense(38, activation='softmax') def call(self, x, **kwargs): x = self.lstm(x) x = self.dropout1(x) x = self.dense(x) x = self.dropout2(x) x = self.dense1(x) return x
实例化模型时不需要再传入n_symbols、embedding_weights两个参数,同时确认text_train的shape为(样本数, input_length, vocab_dim),类型为浮点型。
内容的提问来源于stack exchange,提问作者hongjie zhang
相关产品推荐
相关产品推荐

