Tensorflow 上稀疏多类分类器的神经网络模型

数据挖掘 深度学习 神经网络 张量流 推荐系统
2022-03-04 03:17:54

我试图解决的问题如下:

数据是 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)
2个回答

该模型对我来说似乎很好。您是否尝试优化超参数?您可以使用试错法来优化参数,例如,

  • 学习率
  • 时期数
  • 批量大小等。

除了普通的梯度下降优化器,您还可以尝试其他优化器,例如 Adagrad、Adam 或 RMSProp 等。

最好的,Sangathamilan Ravichandran。

鉴于您的数据很稀疏,可能值得为这种类型的表示尝试损失函数。

例如,Keras 有一个SparseCategoricalCrossentropy类:

tf.keras.losses.SparseCategoricalCrossentropy(
    from_logits=False, reduction="auto", name="sparse_categorical_crossentropy"
)

有关这方面的更多信息,请点击此处

最后,尝试使用模拟数据运行模型总是值得的,以确保您的计算图按预期启动。