我试图解决的问题如下:
数据是 Movielens,N_users=6041 和 N_movies=3953,大约 100 万个收视率。
对于每个用户,定义一个大小为 N_movies 的向量,如果用户在时间 T 之前对电影进行了评分,则向量的值为 1,否则为 0。例如,如果用户对电影 3 和 5 进行评分,则输入向量为 [0,0,1,0,1]。
目标是预测用户将在未来(时间 T 和 T+delta T 之间)评价的电影。标签是大小为 N_movies 的向量,如果用户对电影进行评分 4,则标签向量为 [0,0,0,1,0]。
我目前正在尝试基于全连接层获得一些初步结果,但它似乎根本无法优化损失。表示可能过于稀疏,但神经网络似乎应该能够学习至少一些特征。
是否有可能使这个模型工作,损失函数或优化器是否有问题?
from __future__ import print_function
import tensorflow as tf
from tensorflow.contrib import rnn
import csv
import bisect
import glob
import re
import numpy as np
import random
import data
import config
cfg = config.Config()
graph_data = data.Graph_data(cfg)
X = tf.placeholder("float", [None, cfg.N_movies])
Y = tf.placeholder("float", [None, cfg.N_movies])
def Dense(x):
hidden_layer_1 = tf.layers.dense(inputs=x, units=500, activation=tf.nn.relu)
hidden_layer_2 = tf.layers.dense(inputs=hidden_layer_1, units=50, activation=tf.nn.relu)
output_layer = tf.layers.dense(inputs = hidden_layer_2, units= cfg.N_movies, activation=tf.nn.softmax)
return output_layer
logits = Dense(X)
cross_entropy = tf.reduce_sum(- Y * tf.log(logits), 1)
loss_op = tf.reduce_mean(cross_entropy)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=cfg.learning_rate)
train_op = optimizer.minimize(loss_op)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for step in range(1, cfg.training_steps+1):
batch_x, batch_y = graph_data.train_next_batch(cfg.batch_size)
sess.run(train_op, feed_dict={X: batch_x, Y: batch_y})
if step % cfg.display_step == 0 or step == 1:
loss = sess.run(loss_op, feed_dict={X: batch_x,
Y: batch_y})
print("loss = ",loss)