Ошибка: Ошибка утверждения: не удалось вычислить тензор вывода («dense_2/ truediv:0», форма= (Нет, None, 1), dtype=float32)

#python #tensorflow #lstm #seq2seq

#python #тензорный поток #lstm #seq2seq

Вопрос:

Я пытаюсь реализовать LSTM с вводом (123,45,4) и выводом (123,45,1) с последовательностью из 4 целых чисел в качестве входных данных и одного числа в качестве выходных данных. Я использую Mac OS, Google Colab и TF версии 2.3.0.

Вот моя модель:

 def define_models(n_input, n_output, n_units):
    # define training encoder
    encoder_inputs = Input(shape=(None, n_input))
    encoder = LSTM(n_units, return_state=True)
    encoder_outputs, state_h, state_c = encoder(encoder_inputs)
    encoder_states = [state_h, state_c]
    # define training decoder
    decoder_inputs = Input(shape=(None, n_output))
    decoder_lstm = LSTM(n_units, return_sequences=True, return_state=True)
    decoder_outputs, _, _ = decoder_lstm(decoder_inputs, initial_state=encoder_states)
    decoder_dense = Dense(n_output, activation='softmax')
    decoder_outputs = decoder_dense(decoder_outputs)
    model = Model([encoder_inputs, decoder_inputs], decoder_outputs)
    # define inference encoder
    encoder_model = Model(encoder_inputs, encoder_states)
    # define inference decoder
    decoder_state_input_h = Input(shape=(n_units,))
    decoder_state_input_c = Input(shape=(n_units,))
    decoder_states_inputs = [decoder_state_input_h, decoder_state_input_c]
    decoder_outputs, state_h, state_c = decoder_lstm(decoder_inputs, initial_state=decoder_states_inputs)
    decoder_states = [state_h, state_c]
    decoder_outputs = decoder_dense(decoder_outputs)
    decoder_model = Model([decoder_inputs]   decoder_states_inputs, [decoder_outputs]   decoder_states)
    # return all models
    return model, encoder_model, decoder_model
  

Когда я пытаюсь запустить код: model.fit(x_train, y_train, epochs = 50) Я получаю ошибку: Ошибка утверждения: не удалось вычислить тензор вывода(«dense_2 / truediv: 0», форма= (Нет, None, 1), dtype=float32). Кто-нибудь знает, как это исправить?

Вот код для воспроизведения проблемы:

Загрузить данные:

 with open("training_data_input.txt") as fopen:
  with open("training_data_output.txt") as fopen2:
    for line in fopen:
      myList = line.strip().split()
      myList[0] = myList[0].replace("[","")
      if myList[0] == "":
        myList = myList[1:]
      if "][" in myList[3]:
        j = 0
        print(myList[3])
        myList[3] = myList[3].replace(']][[',"")
        if len(myList[3]) > 3:
          myList[3] = (myList[3][:3])
        myList = myList[:4]
      myList[len(myList)-1] = myList[len(myList)-1].replace("]","")
      x = np.empty((154,45,4),dtype=np.float32)
      i = 0
      j = 0
      if j >=45:
        j = 0
      print(myList)
      x[i][j] = myList
      i =1
      j =1
    for line in fopen2:
      myList = line.strip().split()
      x_out = np.empty((154,45,1), dtype=np.float32)
      myList[0] = myList[0].replace("[","")
      if myList[0] == "":
        myList = myList[1:]
      if "][" in myList[0]:
        j = 0
        myList[0] = myList[0].replace(']][[',"")
        if len(myList[0]) > 3:
          myList[0] = (myList[0][:2])
        myList = myList[:1]
      myList[len(myList)-1] = myList[len(myList)-1].replace("]","")
      i = 0
      j = 0
      if j >=45:
        j = 0
      x_out[i][j] = myList
      i =1
      
print(x.shape)
print(x_out.shape)
  

Модель поезда:

 from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, x_out, test_size = 0.2, random_state = 4)
print(x_train.shape)
print(y_train.shape)

model.fit(x_train, y_train, epochs = 50)
  

Входные данные:
training_data_input.txt
training_data_output.txt

Ответ №1:

В model = Model([encoder_inputs, decoder_inputs], decoder_outputs) вы указываете 2 входа, в то время как в fit вы передаете только 1.