首页 文章

除非我使用嵌入,否则RNN分类失败 . 没有嵌入,所有预测都是同一个类

提问于
浏览
0

我正在尝试对长度为200的向量列表 X 进行分类,其中包含从长度为100的要素的字典 vocab 中选择的整数值,属于类0或1.以下是我输入数据的示例:

X=[[1,22,77,54,51,...],[2,3,1,41,3,...],[12,17,31,4,12,...],...]
y=[0,1,1,...]

例如 np.array(X).shape=(1000,200)y.shape=(200,) . 课程分为50-50 . 我做了一个标准的train_test分为(X,y)和(X_test,y_test) .

我的模型是:

from keras import layers as L
model = keras.models.Sequential()
model.add(L.Embedding(input_dim=100+1,output_dim=32,\
                      input_length=200))
model.add(L.SimpleRNN(64))           
model.add(L.Dense(1,activation='sigmoid'))
model.compile(optimizer='adam',loss='binary_crossentropy',\
              metrics=['accuracy'])

model.fit(X,y,batch_size=128,epochs=20,validation_data=(X_test,y_text))

当我将其用于训练和测试数据时,这种方法非常有效 . 但是,我想尝试跳过嵌入,因为我有一个"small"空间的功能(9026) . 我通过除以 9206. 将训练数据标准化,并尝试构建简单的RNN模型,如下所示:

model = keras.models.Sequential()
model.add(L.InputLayer(200,1))
model.add(L.SimpleRNN(64))           
model.add(L.Dense(1,activation='sigmoid'))
model.compile(optimizer='adam',loss='binary_crossentropy',\
              metrics=['accuracy'])
model.fit(X[:,:,np.newaxis],y,batch_size=128,epochs=20,validation_data=(X_test[:,:,np.newaxis],y_text))

我必须添加 np.newaxis 来获取要编译的模型 . 当我将其与数据相符时,我总是得到0.5的训练和验证精度,这是我从0级到1级的分数 . 我尝试了不同的激活,不同的优化器,RNN中不同数量的单元,不同的批量大小,LSTM,GRU,添加辍学,多层......没有任何作用 .

我的问题是:

  • 我有固定长度的矢量(200)进行分类,只有100个特征的词汇 . 如果没有嵌入,不应该能够做到这一点吗?

  • 有没有人提供有用的建议让非嵌入模型实际训练?

1 回答

  • 1

    循环图层需要输入形状 (batch_size, timesteps, input_dim) ,其中 input_dim 是输入数据中的类别数,并且这些类别是单热编码的,例如, [1, 3], [0, 2] 变为 [[0, 1, 0, 0], [0, 0, 0, 1]], [[1, 0, 0, 0], [0, 0, 1, 0]] .

    现在您的数据形状为 (batch_size, timesteps) 且稀疏编码,这意味着上面编码中的 1 的位置由类别编号隐式给出 . 只需在阵列中添加一个新轴就可以将其设置为正确的形状,因此Keras完全无法工作 .

    它实际上与 Embedding 层一起使用,因为与 Recurrent 层相反,嵌入一个 expects input of the given shape and encoding (将RNN的输入形状与Embedding的输入形状进行比较) .

    要解决此问题,您只需要one-hot encode您的数据 . Keras为此提供了非常方便的to_categorical util函数,但您也可以这样做by hand .

相关问题