word_index
в Tokenizer
начинаться с 1, а не с нуля
Пример:
tokenizer = Tokenizer(filters='')
tokenizer.fit_on_texts(["this a cat", "this is a dog"])
print (tokenizer.word_index)
Выход:
{'this': 1, 'a': 2, 'cat': 3, 'is': 4, 'dog': 5}
Индекс начинается с 1 нес нуля.Поэтому, когда мы создаем матрицу term frequency
с использованием этих индексов
x_dados = tokenizer.texts_to_matrix(["this a cat", "this is a dog"], mode="freq")
Форма x_dados
будет 2x6
, потому что числовые массивы индексируются из 0.
, поэтому no: of columnsв x_dados = 1+len(tokenizer.word_index)
Таким образом, чтобы исправить ваш код изменения
tamanho = len(tokenizer.word_index)
на
tamanho = len(tokenizer.word_index) + 1
Рабочий образец:
dados = ["this is a cat", "that is a dog and a cat"]*100
tokenizer = Tokenizer(filters='')
tokenizer.fit_on_texts(dados)
x_dados = tokenizer.texts_to_matrix(dados, mode="freq")
tamanho = len(tokenizer.word_index)+1
x = Input(shape=(tamanho,))
# Encoder
hidden_1 = Dense(tamanho, activation='relu')(x)
h = Dense(tamanho, activation='relu')(hidden_1)
# Decoder
hidden_2 = Dense(tamanho, activation='relu')(h)
r = Dense(tamanho, activation='sigmoid')(hidden_2)
autoencoder = Model(input=x, output=r)
print (autoencoder.summary())
autoencoder.compile(optimizer='adam', loss='mse')
autoencoder.fit(x_dados, x_dados, epochs=5, shuffle=False)