как кодировать одну строку с авто-кодером в керасе - PullRequest
0 голосов
/ 23 мая 2019

Прежде всего, я скачал movielens-100K , который содержит файл u.data (матрица рейтинга).

Этот код просто читает этот файл и создает для него разреженный тензор:

import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow import SparseTensor
from tensorflow.python.keras import Input, Model
from tensorflow.python.keras.layers import Dense

encoding_dim = 40

user_count = 943
movie_count = 1682
rate_count = 100_000

rate_matrix = pd.read_csv('u.data', sep='\t', names=['user id', 'item id', 'rating', 'timestamp'])
rate_matrix_indices = [[x - 1, y - 1] for x, y in rate_matrix[['user id', 'item id']].to_numpy().astype(int)]
rate_matrix_value = rate_matrix['rating'].to_numpy().astype(float)

sparse_rate_tensor = SparseTensor(
    indices=rate_matrix_indices,
    values=rate_matrix_value,
    dense_shape=[user_count, movie_count]
)

rate_tensor = tf.sparse_tensor_to_dense(sparse_rate_tensor, default_value=0, validate_indices=False, name='rate_tensor')

После создания rate_tensor я просто хочу установить автоэкодер для первого столбца, который является скоростью первого фильма.

я написал этот код для него:

input = Input(shape=(user_count,))
encoded = Dense(encoding_dim, input_dim=(user_count,), activation=tf.keras.activations.sigmoid)(input)
decoded = Dense(user_count, activation=tf.keras.activations.relu)(encoded)

autoencoder = Model(input, decoded)
autoencoder.summary()

autoencoder.compile(
    optimizer=tf.keras.optimizers.Adam(),
    loss=tf.keras.losses.binary_crossentropy,
    metrics=['accuracy'])

movie_rates = tf.slice(rate_tensor, [0, 0], [user_count, 1])
movie_rates = tf.transpose(movie_rates)

history = autoencoder.fit(movie_rates,
                          movie_rates,
                          steps_per_epoch=1,
                          batch_size=1,
                          epochs=100,
                          shuffle=True)

А вот и вывод:

Epoch 98/100
1/1 [==============================] - 0s 2ms/step - loss: -3.1201 - acc: 0.5270
Epoch 99/100
1/1 [==============================] - 0s 2ms/step - loss: -3.1274 - acc: 0.5270
Epoch 100/100
1/1 [==============================] - 0s 2ms/step - loss: -3.1740 - acc: 0.5270

После этого прогресса я попытался выполнить эту простую задачу самостоятельно и обнаружил, что она буквально ничему не научилась !!

Это код:

encoder = autoencoder.get_weights()[0]
hidden = np.matmul(movie_rates, encoder)
decoder = autoencoder.get_weights()[2]
output = np.matmul(hidden, decoder)
dif = np.sum(output - movie_rates)

И вывод: 1262.012...

Хорошо, здесь есть две проблемы:

первый: почему потеря - это отрицательное число? что это значит? (-3,1740)

секунда: почему он ничего не узнал из этой (943, 1) матрицы?

Любая помощь?

Спасибо.

...