我目前正在研究CNN,以使用嵌入层,2个CNN层以及最后一个softmax输出层将各个类[0-14]中的句子分类。我一直获得100%的训练准确度和90%的测试准确度,并且很确定我的网络出了点问题。因此,我对问题进行了故障排除,发现是导致问题的原因是嵌入层,即更改初始化方式导致了更准确的结果-约89%的培训准确度〜34-49%的测试准确度。这使我思考两种方法之间的差异,因为这两种方法都会产生[-1,MAX_DOCUMENT_LENGTH,EMBEDDING_SIZE,1]的输出张量。
以下演示了代码:
工作代码:
with tf.name_scope("embedding"):
init_embeddings = tf.random_uniform([n_words, EMBEDDING_SIZE])
embeddings = tf.get_variable("embeddings", initializer=init_embeddings)
x_emb = tf.nn.embedding_lookup(embeddings, x)
x_emb = tf.expand_dims(x_emb, -1)
无效的代码:
x_emb = tf.reshape(tf.contrib.layers.embed_sequence(
x, vocab_size=n_words, embed_dim=EMBEDDING_SIZE), [-1, MAX_DOCUMENT_LENGTH, EMBEDDING_SIZE, 1])