我一直在尝试使用keras训练一个简单的跳过word word2vec模型。 经过一段时间的训练后,我注意到准确性根本没有改变
我尝试过的事情: 我已经尝试将优化器更改为adam,rmsprop。 2.对于sgd,我尝试将步骤从1.0改为0.000001 我试过改变批量大小。
仍然没有运气。
这是一些代码。
def make_model(self,vocab_size=256,vec_dim=100):
model=Sequential()
model.add(Dense(vec_dim,activation="sigmoid",input_dim=vocab_size))
model.add(Dense(vocab_size,activation="sigmoid"))
sgd=SGD(lr=1.0)
model.compile(loss="categorical_crossentropy",optimizer=sgd,metrics=["accuracy"])
return model
def _get_callbacks(self):
earlystop=EarlyStopping(monitor="val_loss",min_delta=0.0001,patience=10,verbose=2)
checkpoint=ModelCheckpoint("checkpt.hdf5",period=10,verbose=2)
reducelr=ReduceLROnPlateau(monitor="val_loss",factor=0.1,patience=5,verbose=2)
return [earlystop,checkpoint,reducelr]
def train(self,model,X,y):
model.fit(X,y,nb_epoch=1000,callbacks=self._get_callbacks(),validation_split=0.1,verbose=2,batch_size=300)
model.save("model.hdf5")
对于每个单词
,X是len 256的一个热矢量y在len 256的一个热矢量中表示X的上下文中的跳过字。
所以例如序列是[2,6,5,7,9] X将是 [5,5,5,5,7,7,7 ...]
你会的 [2,6,7,9,6,5,9 ...] 对于序列中的每个单词都是如此。当我尝试训练时会发生这种情况:
9s - loss: 4.5012 - acc: 0.1794 - val_loss: 4.5873 - val_acc: 0.1327
Epoch 2/1000
9s - loss: 4.2679 - acc: 0.1801 - val_loss: 4.8339 - val_acc: 0.1327
Epoch 3/1000
9s - loss: 4.2363 - acc: 0.1801 - val_loss: 4.7040 - val_acc: 0.1327
Epoch 4/1000
9s - loss: 4.2102 - acc: 0.1801 - val_loss: 4.6947 - val_acc: 0.1327
Epoch 5/1000
9s - loss: 4.1882 - acc: 0.1801 - val_loss: 4.6625 - val_acc: 0.1327
Epoch 6/1000
9s - loss: 4.1777 - acc: 0.1801 - val_loss: 4.6303 - val_acc: 0.1327
我已经等了大约50个时代,而且acc仍然没有改变。
知道我做错了什么吗?我每次使用keras时都会遇到这个问题,即使在使用LSTM使用RNNs文本生成培训其他模型(如语言建模)时也是如此。
答案 0 :(得分:0)
也许您的学习率太高。您可以尝试将其设置为0.0001
sgd=SGD(lr=0.0001)