首先,我下载了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)矩阵中学到任何东西?
有帮助吗?
谢谢。