The bounty在5天后到期。这个问题的答案有资格获得+50声望奖励。
                            Ramsha Siddiqui希望引起更多关于此问题的注意:“我想弄清楚需要对当前模型进行的更改-或对可以使用我的数据的其他模型的建议。”
                        
                    
                
                            
                    
我使用Keras Functional API编写了这个小模型,以发现两个人之间对话的相似性。我正在使用Gensim的Doc2Vec嵌入将文本数据转换为向量(vocab大小:4117)。我的数据平均分为56个阳性病例和64个阴性病例。 (是的,我知道数据集很小-但这就是我目前所拥有的全部)。

def euclidean_distance(vects):
    x, y = vects
    sum_square = K.sum(K.square(x - y), axis=1, keepdims=True)
    return K.sqrt(K.maximum(sum_square, K.epsilon()))

ch_inp = Input(shape=(38, 200))
csr_inp = Input(shape=(38, 200))

inp = Input(shape=(38, 200))
net = Embedding(int(vocab_size), 16)(inp)
net = Conv2D(16, 1, activation='relu')(net)
net = TimeDistributed(LSTM(8, return_sequences=True))(net)
out = Activation('relu')(net)

sia = Model(inp, out)

x = sia(csr_inp)
y = sia(ch_inp)

sub = Subtract()([x, y])
mul = Multiply()([sub, sub])

mul_x = Multiply()([x, x])
mul_y = Multiply()([y, y])
sub_xy = Subtract()([x, y])

euc = Lambda(euclidean_distance)([x, y])
z = Concatenate(axis=-1)([euc, sub_xy, mul])
z = TimeDistributed(Bidirectional(LSTM(4)))(z)
z = Activation('relu')(z)
z = GlobalMaxPooling1D()(z)
z = Dense(2, activation='relu')(z)
out = Dense(1, activation = 'sigmoid')(z)

model = Model([ch_inp, csr_inp], out)
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])


问题是:我的准确度不会从60.87%改善-我跑了10个纪元,而且准确度保持不变。我在代码中所做的某些事情导致了这一点?还是我的数据有问题?



我还对某些Sklearn模型进行了K折验证,并从数据集中获得了以下结果:



另外,下面附有我的数据集概述:



我肯定在为此而苦苦挣扎-因此从字面上看,这里的任何帮助将不胜感激。谢谢!

更新:
我将数据量增加到1875个火车样本。其准确性提高到70.28%。但是它在所有迭代中仍然保持不变。

最佳答案

我看到两件事可能在那里很重要。


您在'relu'之后使用LSTM。 Keras中的LSTM已经具有'tanh'作为默认激活。因此,尽管您未锁定模型,但通过激活将结果限制在小范围内并减少了负值的范围之间,使模型的学习变得更加困难
您使用的'relu'单位很少!单位很少,初始化不正确,学习率高和运气不好的Relu将卡在零范围内而没有任何梯度。


如果您的损失完全冻结,则最有可能是由于上述第二点。而且,即使它没有冻结,也可能仅使用2个Dense单位中的一个,这会使图层非常差。

您应该从下面做一些事情:


您的模型很小,因此请使用'relu'退出并改用'tanh'。这将为您的模型提供预期的功率。
否则,您肯定应该增加LSTMDense的单位数,因此'relu'不会轻易卡住。
您可以在BatchNormalization之后和Dense之前添加'relu'层,这样可以保证一定数量的单位始终大于零。


无论如何,请勿在'relu'之后使用LSTM



另一种方法是使模型更强大。

例如:

z = TimeDistributed(Bidirectional(LSTM(4)))(z)
z = Conv1D(10, 3, activation = 'tanh')(z) #or 'relu' maybe
z = MaxPooling1D(z)
z = Conv1D(15, 3, activation = 'tanh')(z) #or 'relu' maybe
z = Flatten()(z) #unless the length is variable, then GlobalAveragePooling1D()(z)
z = Dense(10, activation='relu')(z)
out = Dense(1, activation = 'sigmoid')(z)

关于python - 提高连体网络的准确性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60100361/

10-12 17:08