基于字符的LSTM-RNN肽序列生成模型报错:ValueError: This model has not yet been built 解决方案咨询
解决"ValueError: This model has not yet been built"及后续生成报错问题
看起来你遇到的问题主要来自两个核心点:模型初始化的代码错误,以及针对短肽序列的数据集适配问题。我来一步步帮你排查解决:
1. 最直接的错误:模型初始化的参数传递错误
你自定义的MyModel类在调用父类构造函数时犯了一个小疏忽——多传递了self参数,这直接导致TensorFlow无法正确初始化并构建模型结构。
错误代码:
super().__init__(self)
修正后的正确代码:
super().__init__()
这个小错误是触发ValueError: This model has not yet been built的根本原因,修正后模型就能正常识别层结构,model.summary()也能顺利执行。
2. 数据集适配问题:过长的序列长度不适合短肽序列
原教程针对莎士比亚的长文本设置了seq_length = 100,但你的肽序列都是短字符组成的,这个长度设置会导致:
- 生成的训练序列为空(因为文本总长度不足以支撑这么长的序列,
batch操作会丢弃所有不符合长度要求的片段) - 模型无法获得有效输入样本来完成构建
解决方案:
先分析你的数据集,设置一个适配的序列长度:
# 拆分出所有肽序列,统计平均长度 peptides = text.split() avg_length = np.mean([len(p) for p in peptides]) # 设置序列长度为平均长度附近的整数,兜底值设为10避免极端情况 seq_length = int(avg_length) if avg_length > 0 else 10 # 检查生成的样本数,确保大于0 examples_per_epoch = len(text)//(seq_length+1) print(f"调整后的序列长度: {seq_length}, 每轮训练样本数: {examples_per_epoch}")
如果examples_per_epoch输出为0,说明序列长度还是太大,继续调小即可。
3. 解决"example_batch_predictions未定义"的后续报错
当你修正了上述两个问题后,重新运行代码,example_batch_predictions = model(input_example_batch)这一行就能正常执行——模型已经正确初始化,且有有效的输入数据,后续的tf.random.categorical相关代码也就不会再报错。
完整修正后的核心代码片段
class MyModel(tf.keras.Model): def __init__(self, vocab_size, embedding_dim, rnn_units): super().__init__() # 这里修正了参数错误 self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim) self.gru = tf.keras.layers.GRU(rnn_units, return_sequences=True, return_state=True) self.dense = tf.keras.layers.Dense(vocab_size) def call(self, inputs, states=None, return_state=False, training=False): x = inputs x = self.embedding(x, training=training) if states is None: states = self.gru.get_initial_state(x) x, states = self.gru(x, initial_state=states, training=training) x = self.dense(x, training=training) if return_state: return x, states else: return x # 适配短肽序列的序列长度设置 peptides = text.split() avg_length = np.mean([len(p) for p in peptides]) seq_length = int(avg_length) if avg_length > 0 else 10 examples_per_epoch = len(text)//(seq_length+1) print(f"调整后的序列长度: {seq_length}, 每轮训练样本数: {examples_per_epoch}") # 后续的数据集处理、模型实例化代码保持不变...
额外检查建议
- 确认你的
generatorinput.txt文件读取正常,没有编码问题或空文件的情况 - 检查
vocab变量的内容,确保包含了你肽序列中的所有字符(包括空格,如果你的序列需要保留空格分隔的话)
内容的提问来源于stack exchange,提问作者Ash Roy
相关产品推荐
相关产品推荐

