Keras字符语言模型训练报错:输入维度与序列值设置异常
我之前在训练字符级模型时也踩过正则器相关的类似坑,结合你说的输入是符合(50,28)形状的独热编码、错误出在正则器数组转换环节的情况,给你几个具体的排查和解决方向:
检查正则器的应用层维度匹配
这个错误大概率是正则器和它所应用的层维度不兼容导致的。比如你给某层加了kernel_regularizer或bias_regularizer,但该层的输入张量形状和正则器期望的处理逻辑不匹配——比如把正则器错误地加到了输入层,或者中间层的动态维度没有被正确处理。建议你逐个检查模型中带正则器的层,确认正则器的应用对象是参数维度固定的层(比如Dense、Conv层),而非输入层这类维度特殊的层。确认训练数据的完整形状
你提到输入形状是(50,28),但模型训练时通常需要批量输入,也就是完整形状应该是(batch_size, 50, 28)。如果你的训练数据缺少批量维度,或者在数据预处理时把维度顺序搞反了(比如变成了(50, batch_size, 28)),正则器在处理参数时就会因为张量维度不匹配,触发"用序列设置数组元素"的错误。可以在训练前用print(X_train.shape)确认一下数据的完整维度。排查正则器的初始化写法
有时候是正则器的初始化方式出了问题——比如不小心把正则器对象放到了列表或其他序列里。举个例子:如果你写的是kernel_regularizer=[tf.keras.regularizers.L2(0.01)](多了方括号),而不是kernel_regularizer=tf.keras.regularizers.L2(0.01),模型就会把这个列表当成待处理的序列,进而抛出错误。检查所有正则器的赋值语句,确保直接传入正则器实例,而非序列类型。自定义正则器的张量操作检查(如果有自定义)
如果你用了自己写的自定义正则器,那问题很可能出在正则器内部的张量转换上。比如你在正则器里强行把张量转换成numpy数组,但此时张量还保留着动态维度(比如batch_size是None),这时候调用.numpy()就会出错。确保自定义正则器全程用TensorFlow的张量操作(比如tf.reduce_sum、tf.norm等)计算正则化损失,不要随意转换成numpy数组。
内容的提问来源于stack exchange,提问作者Sledge

