Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.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 如何使用RNN的嵌入层和RecoSys的分类特征分类任务_Python_Tensorflow_Lstm_Recurrent Neural Network_Embedding - Fatal编程技术网

Python 如何使用RNN的嵌入层和RecoSys的分类特征分类任务

Python 如何使用RNN的嵌入层和RecoSys的分类特征分类任务,python,tensorflow,lstm,recurrent-neural-network,embedding,Python,Tensorflow,Lstm,Recurrent Neural Network,Embedding,我想构建一个模型(RNN>>LSTM),其中包含一个用于分类功能(项目ID)的嵌入层,我的培训集看起来是这样的: 列车x=[[184563.1]、[184324.1]、[187853.1]、[174963.1]、[181663.1]、[…]、[…]、[…]、[…]、[…]、[…]、[…]、[…]、[…]、…] 我预测第六项ID: 序列y=[0,1,2,…,12691] 我有12692个唯一的项目ID,时间步长长度=5,这是一个分类任务 这是我迄今为止所做工作的简要总结:(如果我错了,请纠正我)

我想构建一个模型(RNN>>LSTM),其中包含一个用于分类功能(项目ID)的嵌入层,我的培训集看起来是这样的:

列车x=[[184563.1]、[184324.1]、[187853.1]、[174963.1]、[181663.1]、[…]、[…]、[…]、[…]、[…]、[…]、[…]、[…]、[…]、…]

我预测第六项ID:

序列y=[0,1,2,…,12691]

我有12692个唯一的项目ID,时间步长长度=5,这是一个分类任务

这是我迄今为止所做工作的简要总结:(如果我错了,请纠正我)

  • 分类功能的一个热编码:
  • 训练x=[[1 0 0…0 0 0],[0 1 0…0 0 0],[0 1…0 0 0],[…],[…],[…],[…],[…],[…],[…],[…],[…],[…],…]

  • 构建模型:
  • model=Sequential()
    添加(嵌入(输入尺寸=12692,输出尺寸=250,输入长度=5))
    添加(LSTM(128,返回序列=True)
    模型。添加(辍学(0.2))
    添加(BatchNormalization())
    model.add(LSTM(128,返回序列=True))
    模型。添加(辍学(0.1))
    添加(BatchNormalization())
    型号.添加(LSTM(128))
    模型。添加(辍学(0.2))
    添加(BatchNormalization())
    添加(密集(32,activation='relu'))
    模型。添加(辍学(0.2))
    model.add(密集型(12692,activation='softmax'))
    opt=tf.keras.optimizers.Adam(lr=0.001,衰减=1e-6)
    model.compile(
    损失=“稀疏”\u分类”\u交叉熵',
    优化器=opt,
    指标=[‘准确度’])
    打印(model.summary())
    历史=model.fit(
    列车x,列车y,
    批次大小=64,
    时代,
    验证\数据=(验证\ x,验证\ y))
    分数=模型。评估(验证x,验证y,详细=0)
    
    我得到这个模型摘要:

    培训131204个样本,验证107904个样本

    但在此之后,出现以下错误:

    ValueError:检查输入时出错:预期嵌入_输入为2维,但得到了具有形状的数组(131204、512692)


    我的错误在哪里?解决方案是什么?

    嵌入层将正整数(索引)转换为固定大小的密集向量。因此,您的
    train_x
    不是一个热编码的整数,而是表示其在词汇表中的索引的整数。它将是与分类特征相对应的整数

    序列x.形状
    将是
    (样本x 5的编号)
    -->每个代表分类特征的索引

    train_y.shape
    将是
    (样本编号)
    -->每个代表时间序列中第六项的索引

    工作样本
    谢谢你的回答。如果你也能解释这3点那就太好了:1.为什么输入中的“+1”_dim=12692+1?2.正如你在这个例子中看到的,如果我想包括价格(数字),我只考虑itemID作为一个特性作为第二个特性,我应该如何将这两个特性结合起来作为模型的输入?3.您对改进模型有什么建议,比如使用:TimeDistributed或GRU?1。第一个itemID表示为1而不是0,因此它将是
    vocab_size+1
    (我在回答中给出的文档链接中也提到了这一点)2.为其他功能创建一个输入层,并将嵌入层的输出与输入层合并。3.您必须进行实验。一般来说,使用GRU进行训练比使用LSTM更快,但从性能点(精度)来看,两者几乎相同。
    import numpy as np
    import keras
    from keras.layers import Embedding, LSTM, Dense
    n_samples = 100
    
    train_x = np.random.randint(0,12692,size=(n_samples ,5))
    train_y = np.random.randint(0,12692,size=(n_samples))
    
    
    model = keras.models.Sequential()
    
    model.add(Embedding(input_dim=12692+1, output_dim=250, input_length=5))
    model.add(LSTM(128, return_sequences=True))
    model.add(LSTM(32))
    model.add(Dense(32, activation='relu'))
    model.add(Dense(12692, activation='softmax'))
    
    opt = keras.optimizers.Adam(lr=0.001, decay=1e-6)
    model.compile(
          loss='sparse_categorical_crossentropy',
          optimizer=opt,
          metrics=['accuracy'])
    
    print(model.summary())
    
    history = model.fit(
          train_x, train_y,
          batch_size=64,
          epochs=32)