2017-04-18 96 views
1

我有一些培训数据x_trainx_train的一些相应标签,名为y_train。下面是如何x_trainy_train构造:LSTM with keras

train_x = np.array([np.random.rand(1, 1000)[0] for i in range(10000)]) 
train_y = (np.random.randint(1,150,10000)) 

train_x有10000行和1000列的每一行。 train_y对于train_x中的每个样本具有介于1和150之间的标签并且代表每个train_x样本的代码。

我也有一个样本,称为样本,这是1行1000列,我想用这个LSTM模型预测。这个变量被定义为

sample = np.random.rand(1,1000)[0] 

我想训练和预测使用Keras的这个数据的LSTM。我想采用这个特征向量,并使用这个LSTM来预测范围从1到150的代码之一。我知道这些是随机数组,但是我不能发布我拥有的数据。我尝试了以下方法,我认为应该可以工作,但是我面临一些问题

model = Sequential() 
    model.add(LSTM(output_dim = 32, input_length = 10000, input_dim = 1000,return_sequences=True)) 
    model.add(Dense(150, activation='relu')) 
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 
    history = model.fit(train_x, train_y, 
       batch_size=128, nb_epoch=1, 
       verbose = 1) 
    model.predict(sample) 

任何对此管道的帮助或调整都会很好。我不确定output_dim是否正确。我想在1000维数据的每个样本上传递LSTM,然后再生成1到150范围内的特定代码。谢谢。

回答

1

我看到至少有三件事情你需要改变:

  1. 改变这一行:

    model.add(Dense(150, activation='relu')) 
    

    到:

    model.add(Dense(150, activation='softmax')) 
    

    的离开'relu'的激活使你的输出无界的,而它需要有一个概率解释(如你使用categorical_crossentropy)。

  2. 变动损失或目标:

    当您使用categorical_crossentropy你需要改变你的目标是一个独热编码向量长度150的另一种方式是让你的目标,但改变亏损到sparse_categorical_crossentropy

  3. 更改目标范围:

    Keras具有基于0的数组索引(如在PythonCC++所以你的值应在范围[0, 150)代替[1, 150]

+0

所以当我。改变为一个长度为150的热点编码向量我在每个地方都会得到一串小数点作为预测,这些小数点代表什么?它们是1,2,3级,...,150级的概率吗? –

+0

是的 - 但记住ab取出这个基于0的数组索引。第1类的概率是指数0, - 第2类 - 指数1等 –

+0

好的非常感谢你!你可以用k热点编码矢量做这个吗?假设对于样本1,我们有[5,8,9],而样本2我们有[130,11,12,5,9],其中有不同数量的标签? –