我正在尝试对长度为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 回答
循环图层需要输入形状
(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 .