如何将卷积层添加到自定义估计器

我制作了一个基本的自定义估算器来对短文本进行分类。

它几乎是从 www.tensorflow.org 上的教程中提取的,几乎没有小改动,主要是为了更容易调整。

特征列是 categorical_column_with_hashbucket,包裹在 embedding_column 中。

https://www.tensorflow.org/api_docs/python/tf/feature_column/categorical_column_with_hash_bucket

https://www.tensorflow.org/api_docs/python/tf/feature_column/embedding_column

达到后,我认为是在测试数据集上大约 0.6 精度的最佳性能。我决定从 Tensorflow 库中添加一维卷积层。


https://www.tensorflow.org/api_docs/python/tf/layers/conv1d


不幸的是,文档没有指定它需要 3 维张量作为输入。如果我只是使用 input_layer 作为输入,例如这样:


net = tf.layers.conv1d(net,filters=1,kernel_size=1)

我得到以下异常:


ValueError: Input 0 of layer conv1d_1 is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: [None, 1024]

顺便说一句,1024 是嵌入维度,但不管它有多大,反正进程会崩溃。


我可以扩展张量,像这样添加维度:


more_dim = tf.expand_dims(input=net,axis=-1)

net = tf.layers.conv1d(more_dim,filters=1,kernel_size=1)

但这只会给我另一个例外,这次是在计算 softmax 交叉熵损失时:


ValueError("Can not squeeze dim[2], expected a dimension of 1, got 18 for 'sparse_softmax_cross_entropy_loss/remove_squeezable_dimensions/Squeeze' (op: 'Squeeze') with input shapes: [?,1024,18].",)

最后一个维度 18 是标签的数量。我可以再次调整张量的大小。但我觉得这可能是浪费时间。


而且由于我公认的幼稚方法行不通。我不得不问,如何正确地做到这一点。


汪汪一只猫
浏览 107回答 1
1回答

梵蒂冈之花

我认为 Tensorflow 需要额外的通道维度。尝试net = tf.expand_dims(net, -1) # Adding a channel as last dimension. net = tf.layers.conv1d(net,filters=1,kernel_size=1)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python