Используя предварительную подготовку GloveVector из Стэнфорда, чтобы получить осмысленное представление каждого слова, но я хочу представления для предложения, содержащего 5-15 слов, чтобы я мог использовать косинусное сходство для сопоставления при получении нового предложения.Я устанавливаю 15 слов (фиксированный размер) каждого предложения и применяю слой для встраивания, тогда новая форма ввода будет иметь размеры 15 X 300 (если у меня меньше 15 слов, тогда дополненные значения составляют 15 слов (одна случайная униформа)распределение вектора 300D)
Ниже приведены формы моей сети
- [Нет, 15] - Вложение необработанных входных данных и дополнение (1) идентификаторов
- [Нет,15, 300, 1], --input
- [None, 8, 150, 128], - conv 1
- [None, 4, 75, 64], - conv 2
- [None, 2, 38, 32], - conv 3
- [None, 1, 19, 16], - conv 4
- [None, 1, 10, 4] - conv 5
- [Нет, 50] --------- Скрытая форма (новые значимые представления) ------
- [Нет, 1, 10, 4] - кодированный вход для de-conv
- [Нет, 1, 19, 16], - conv_trans 5
- [Нет, 2, 38, 32], - conv_trans 4
- [Нет, 4, 75, 64], - conv_trans 3
- [Нет, 8, 150, 128], - conv_trans 2
- [Нет, 15, 300, 1] - conv_trans 1 - дляфункция потерь с входными данными
Я пробовал модель CNN с вложенным слоем в tenorflow
self._inputs = tf.placeholder(dtype=tf.int64, shape=[None, self.sent_len], name='input_x') #(?,15)
losses = []
# lookup layer
with tf.variable_scope('embedding') as scope:
self._W_emb = _variable_on_cpu(name='embedding', shape=[self.vocab_size, self.emb_size], initializer=tf.random_uniform_initializer(minval=-1.0, maxval=1.0))
# assigned pretrained embedding here, so initializer would be overrided
sent_batch = tf.nn.embedding_lookup(params=self._W_emb, ids=self._inputs)
sent_batch = tf.expand_dims(sent_batch, -1)
self._x = sent_batch
encoder = []
shapes = []
current_input = sent_batch
shapes.append(current_input.get_shape().as_list())
for layer_i, n_output in enumerate(n_filters[1:]):
with tf.variable_scope('Encode_conv-%d' % layer_i) as scope:
n_input = current_input.get_shape().as_list()[3]
W, wd = _variable_with_weight_decay('W-%d' % layer_i, shape=[filter_size,filter_size,n_input,n_output],
initializer=tf.random_uniform_initializer(minval=-1.0, maxval=1.0), wd=self.l2_reg)
losses.append(wd)
biases = _variable_on_cpu('bias-%d' % layer_i, shape=[n_output], initializer=tf.constant_initializer(0.00))
encoder.append(W)
output = tf.nn.relu(tf.add(tf.nn.conv2d(current_input, W, strides=[1, 2, 2, 1], padding='SAME'), biases), name=scope.name)
current_input = output
shapes.append(output.get_shape().as_list())
#z = current_input
original_shape = current_input.get_shape().as_list()
flatsize = original_shape[1]*original_shape[2]*original_shape[3]
height,width,channel = original_shape[1]*1,original_shape[2]*1,original_shape[3]*1
current_input = tf.reshape(current_input,[-1,flatsize])
with tf.variable_scope('Encode_Z-%d' % layer_i) as scope:
W_en, wd_en = _variable_with_weight_decay('W', shape=[current_input.get_shape().as_list()[1], outsize],
initializer=tf.truncated_normal_initializer(stddev=0.05),
wd=self.l2_reg)
losses.append(wd_en)
biases_en = _variable_on_cpu('bias', shape=[outsize],initializer=tf.constant_initializer(0.00))
self._z = tf.nn.relu(tf.nn.bias_add(tf.matmul(current_input, W_en), biases_en)) # Compressed representation (?,50)
with tf.variable_scope('Decode_Z-%d' % layer_i) as scope:
W_dc, wd_dc = _variable_with_weight_decay('W', shape=[self._z.get_shape().as_list()[1], current_input.get_shape().as_list()[1]],
initializer=tf.truncated_normal_initializer(stddev=0.05), wd=self.l2_reg)
losses.append(wd_dc)
biases_dc = _variable_on_cpu('bias', shape=[current_input.get_shape().as_list()[1]],initializer=tf.constant_initializer(0.00))
current_input = tf.nn.relu(tf.nn.bias_add(tf.matmul(self._z, W_dc), biases_dc))
current_input = tf.reshape(current_input,[-1,height,width,channel])
encoder.reverse()
shapes.reverse()
for layer_i, shape in enumerate(shapes[1:]):
with tf.variable_scope('Decode_conv-%d' % layer_i) as scope:
W = encoder[layer_i]
b = _variable_on_cpu('bias-%d' % layer_i, shape=[W.get_shape().as_list()[2]], initializer=tf.constant_initializer(0.00))
hh,ww,cc = shape[1], shape[2], shape[3]
output = tf.nn.relu(tf.add( tf.nn.conv2d_transpose(current_input, W, [tf.shape(sent_batch)[0],hh,ww,cc],strides=[1, 2, 2, 1],padding='SAME'), b),name=scope.name)
current_input = output
self._y = current_input
# loss
with tf.variable_scope('loss') as scope:
cross_entropy_loss = tf.reduce_mean(tf.square(current_input - sent_batch))
losses.append(cross_entropy_loss)
self._total_loss = tf.add_n(losses, name='total_loss')
opt = tf.train.AdamOptimizer(0.0001)
grads = opt.compute_gradients(self._total_loss)
self._train_op = opt.apply_gradients(grads)
Но результаты неэффективны, потому что косинус сходства ниже двух предложений равен 0,9895 после полученияскрытое сжатое представление сверху модели.
- Функциональные нарушения полиморфноядерных нейтрофилов
- Неуточненный перелом черепа, последствия '
А если я возьму предложенияс 2-5 словами, и сходство возрастает до 0,9999 (подозрение на то, что проблема была вызвана большим количеством значений заполнения по умолчанию с таким же равномерным распределением из встраиваемых поисков)
Ниже может быть полезна информация,
- Всего 10 000 обучающих образцов с 10 эпохами
- Используемые активации Relu
- Функция потери MSE
- Оптимизаторы Адама
- Ниже приведено распределение слов по более чемвсе предложение [
![1]](https://i.stack.imgur.com/VJoAR.jpg)
И, наконец, кто-нибудь может подсказать, что идет не так?а сам подход не хорош, чтобы продолжить?