【问题标题】:ValueError: Dimensions must be equal, but are 100 and 19 with input shapes: [?,100], [?,100,19]ValueError:尺寸必须相等,但输入形状为 100 和 19:[?,100], [?,100,19]
【发布时间】:2022-01-26 09:44:45
【问题描述】:

我的代码有错误,我已经阅读了文档,但仍然错误,如何修复此错误?

代码:

import tensorflow.keras.backend as K
import tensorflow_addons as tfa
from tensorflow_addons.layers import CRF
from keras_crf import CRFModel
def create_model(): #
  max_words=length_long_sentence
  MAX_SENTENCE_NUM=100
  embedding_size=100
  lstm_size=128
  learn_rate=0.01
  output_size=len(unique_tag_set)

  current_input=Input(shape=(MAX_SENTENCE_NUM,max_words,)) 
  emb_current = Embedding(vocab_size, embedding_size, weights= 
  [embedding_matrix],input_length=max_words, name='current_embed',trainable=False)(current_input)
  hidden_vectors=TimeDistributed(Bidirectional(LSTM(units=lstm_size, return_sequences=False))) 
  (emb_current ) 
  hidden_vectors=Bidirectional(LSTM(units=lstm_size, return_sequences=True))(hidden_vectors ) 
  
  base = tf.keras.Model(inputs=current_input, outputs=hidden_vectors)
  model = CRFModel(base, 19)
  opt = tf.keras.optimizers.Adam(learning_rate=learn_rate)
  model.compile(optimizer=opt, metrics=['acc'])
  print(model.summary())
  return model
model_2=create_model()

这是模型摘要:

这是适合训练数据的代码:

history_2=model_2.fit(x_train_split,y_train_split,
                    epochs=1,batch_size=16,
                    shuffle = False, verbose = 1,
                    validation_split=0.2,
                    sample_weight=sample_weights)

我得到了这个错误:

ValueError:在用户代码中:

File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 878, in train_function  *
    return step_function(self, iterator)
File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 867, in step_function  **
    outputs = model.distribute_strategy.run(run_step, args=(data,))
File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 860, in run_step  **
    outputs = model.train_step(data)
File "/usr/local/lib/python3.7/dist-packages/keras_crf/crf_model.py", line 49, in train_step
    crf_loss = -tfa.text.crf_log_likelihood(potentials, y, sequence_length, kernel)[0]
File "/usr/local/lib/python3.7/dist-packages/tensorflow_addons/text/crf.py", line 242, in crf_log_likelihood
    inputs, tag_indices, sequence_lengths, transition_params
File "/usr/local/lib/python3.7/dist-packages/tensorflow_addons/text/crf.py", line 104, in crf_sequence_score
    return tf.cond(tf.equal(tf.shape(inputs)[1], 1), _single_seq_fn, _multi_seq_fn)
File "/usr/local/lib/python3.7/dist-packages/tensorflow_addons/text/crf.py", line 97, in _multi_seq_fn
    unary_scores = crf_unary_score(tag_indices, sequence_lengths, inputs)
File "/usr/local/lib/python3.7/dist-packages/tensorflow_addons/text/crf.py", line 277, in crf_unary_score
    flattened_tag_indices = tf.reshape(offsets + tag_indices, [-1])

ValueError: Dimensions must be equal, but are 100 and 19 for '{{node cond/add_1}} = AddV2[T=DT_INT32](cond/add, cond/add_1/Cast)' with input shapes: [?,100], [?,100,19].

【问题讨论】:

  • 试试tf.keras.utils.to_categorical。链接:https://www.tensorflow.org/api_docs/python/tf/keras/utils/to_categorical
  • 这可能是因为您有 19 个课程。但是您的 y 向量有数字:0, ... 18
  • 可以加y_train_split.shape吗?
  • Y_train_split 形状为:(1114, 100, 19)。
  • 哦!在那种情况下,这是我认为的另一种方式。模型输出类号。您能否分享前向传递的输出大小:model2(x_train_split) 甚至是x_train_split 的子集?

标签: python-3.x tensorflow tf.keras crf tensorflow-addons


【解决方案1】:

这可能是因为您有 19 个班级。但是你的y 向量有数字:0, ..., 18。您的模型正在输出一个 19 维向量。

所以,试试tf.keras.utils.to_categorical。链接:https://www.tensorflow.org/api_docs/python/tf/keras/utils/to_categorical

基本上:

y_train_split = tf.keras.utils.to_categorical(y_train_split)
# code to fit

【讨论】:

  • Y 向量已经被 one-hot 编码。
  • 训练实例1的Y向量是这样的:array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0]。
猜你喜欢
  • 2021-01-31
  • 2017-12-10
  • 1970-01-01
  • 2021-08-18
  • 2018-02-11
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多