Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更改嵌入TensorFlow的大小(例如,在推荐引擎中创建新用户)_Python_Tensorflow_Recommendation Engine - Fatal编程技术网

Python 更改嵌入TensorFlow的大小(例如,在推荐引擎中创建新用户)

Python 更改嵌入TensorFlow的大小(例如,在推荐引擎中创建新用户),python,tensorflow,recommendation-engine,Python,Tensorflow,Recommendation Engine,我有一个基于TensorFlow的推荐系统。每个用户都有与其关联的1+numFactors数字:一个numFactors向量和一个数字的偏移量。每个任务还分配了一个偏差和numFactors向量。TF-recom代码是 def inference_svd(user_batch, item_batch, user_num, item_num, dim=5): bias_global = tf.get_variable("bias_global", shape=[]) w_bias_

我有一个基于TensorFlow的推荐系统。每个用户都有与其关联的
1+numFactors
数字:一个
numFactors
向量和一个数字的偏移量。每个任务还分配了一个偏差和
numFactors
向量。TF-recom代码是

def inference_svd(user_batch, item_batch, user_num, item_num, dim=5):
    bias_global = tf.get_variable("bias_global", shape=[])
    w_bias_user = tf.get_variable("embd_bias_user", shape=[user_num])
    w_bias_item = tf.get_variable("embd_bias_item", shape=[item_num])
    bias_user = tf.nn.embedding_lookup(w_bias_user, user_batch, name="bias_user")
    bias_item = tf.nn.embedding_lookup(w_bias_item, item_batch, name="bias_item")
    w_user = tf.get_variable("embd_user", shape=[user_num, dim], initializer=tf.truncated_normal_initializer(stddev=0.02))
    w_item = tf.get_variable("embd_item", shape=[item_num, dim], initializer=tf.truncated_normal_initializer(stddev=0.02))
    embd_user = tf.nn.embedding_lookup(w_user, user_batch, name="embedding_user")
    embd_item = tf.nn.embedding_lookup(w_item, item_batch, name="embedding_item")
    infer = tf.reduce_sum(tf.multiply(embd_user, embd_item), 1)
    infer = tf.add(infer, bias_global)
    infer = tf.add(infer, bias_user)
    infer = tf.add(infer, bias_item, name="svd_inference")
    regularizer = tf.add(tf.nn.l2_loss(embd_user), tf.nn.l2_loss(embd_item), name="svd_regularizer")
    return infer, regularizer
我已经能够让这段代码正常工作,并且能够将它与REST-API连接起来

我遇到的问题是当我获得新用户时。我知道我想做什么:

  • bias\u用户添加一行,初始化为0
  • embd\u用户添加一行,初始化为0
  • 当用户对新项目进行评分时,我们使用相同的图表,但
    冻结项目的权重(我可以使用
    optimizer.minimize上的
    var\u list
但是,权重和偏差的形状已提前声明。我在tensorflow(运行或部署)上看到的所有材料都允许权重发生变化,但似乎不允许网络增长

如果我在
numpy
中实现了这一点,我只需将新行添加到相应的矩阵中即可。有两种方法可以做到这一点,例如创建新的图形和变量,但似乎最好首先重用用于训练模型的图形(以确保一致性)


我正在寻找一个处理改变嵌入张量大小的“最佳实践”系统,特别是一个在线系统,它必须快速提供预测服务(防止昂贵的操作).

在系统中添加新用户时,最基本的困难在于需要重新培训,以便能够为新用户提供有意义的预测。即使您能够动态调整嵌入矩阵的大小,您会使用哪些值作为描述新用户的参数

考虑到这一点,您有两个选择

  • 保存图表的权重,然后创建一个具有调整尺寸的新图表,并根据包含新用户信息的数据对其进行重新训练。正如你所说,这可能太昂贵了,不可能在你的关键路径上
  • 使用某种折叠式方法。例如,您可以使用与类似项目交互的用户嵌入的平均值来初始化新用户的嵌入
  • 使用一个没有这个问题的模型,并且可以以更自然的方式合并新用户
  • 我的建议是第三种选择。有一些模型类在进行预测时直接获取用户交互的顺序(或集合),并且不依赖于您提前声明用户数量。例如,您可以使用以下选项之一:

  • 模型:一个简单的自动编码器模型,将用户与之交互的项目集作为输入
  • :一种循环模型,将预测时的用户交互序列作为输入
  • 两种模型自然地处理新用户,而不改变计算图;添加新项目需要重新培训


    第一类模型的一个实现是:;对于第二堂课,请查看我的推荐人系统包。

    在系统中添加新用户时,最基本的困难在于需要重新培训,以便能够为新用户提供有意义的预测。即使您能够动态调整嵌入矩阵的大小,您会使用哪些值作为描述新用户的参数

    考虑到这一点,您有两个选择

  • 保存图表的权重,然后创建一个具有调整尺寸的新图表,并根据包含新用户信息的数据对其进行重新训练。正如你所说,这可能太昂贵了,不可能在你的关键路径上
  • 使用某种折叠式方法。例如,您可以使用与类似项目交互的用户嵌入的平均值来初始化新用户的嵌入
  • 使用一个没有这个问题的模型,并且可以以更自然的方式合并新用户
  • 我的建议是第三种选择。有一些模型类在进行预测时直接获取用户交互的顺序(或集合),并且不依赖于您提前声明用户数量。例如,您可以使用以下选项之一:

  • 模型:一个简单的自动编码器模型,将用户与之交互的项目集作为输入
  • :一种循环模型,将预测时的用户交互序列作为输入
  • 两种模型自然地处理新用户,而不改变计算图;添加新项目需要重新培训


    第一类模型的一个实现是:;对于第二节课,请查看我的推荐系统包。

    谢谢您提供的其他选择,我一定会看一看。我有一个
    numpy
    模型,在这个模型中,我手工实现了SGD,初始化新用户也不错:存在全局偏差和每项偏差,所以我们只需将新用户权重设置为零(最初),然后将用户偏差设置为平均值(应该接近零)。我使用TF来(a)获得使用它的经验,(b)使用更好的优化器。我很好奇是否有更灵活的方法(例如,我们可以使用占位符而不指定其大小)来确保我有效地使用TF。感谢您的替代方案,我一定会看看。我有一个
    numpy
    模型,在这个模型中,我手工实现了SGD,初始化新用户也不错:存在全局偏差和每项偏差,所以我们只需将新用户权重设置为零(最初),然后将用户偏差设置为平均值(应该接近零)。我使用TF来(a)获得使用它的经验,(b)使用更好的优化器。我很好奇是否有更灵活的应用程序