Вывод ошибок при внедрении слоев tf-hub с помощью Conv или Rnn - PullRequest
0 голосов
/ 23 марта 2020

Вот код, идея в том, что я хочу построить многоязыковой классификатор настроений, но здесь проблема в следующем: (tenorflow 2.0.1), (tf-hub 0.7.0)

import tensorflow as tf
import tensorflow_hub as hub


ml_module = hub.load('https://tfhub.dev/google/universal-sentence-encoder-multilingual/3')
module = hub.KerasLayer(ml_module , dtype=tf.string, trainable=False, name='bert_embedding')

input_text = tf.keras.Input((), dtype=tf.string, name='input_text')
embedding = module(input_text)
conv1 = tf.keras.layers.Conv1D(32, 2, padding='valid', activation='relu', strides=1)(embedding)
dense1 = tf.keras.layers.Dense(512, activation="relu")(conv1)
layer1 = tf.keras.layers.Dense(9, name='sentiment')(dense1)
model = tf.keras.models.Model(inputs=input_text, outputs=layer1)


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

Может быть, я могу попробовать с помощью лямбда-функции keras изменить размер вывода вложения, но я не нашел способа заставить его работать

У вас есть какие-нибудь идеи?

Спасибо

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

О, спасибо, Шубхам, это работает = D

Это код, чтобы заставить это работать

import tensorflow as tf
import tensorflow_hub as hub


ml_module = hub.load('https://tfhub.dev/google/universal-sentence-encoder-multilingual/3')
module = hub.KerasLayer(ml_module , dtype=tf.string, trainable=False, name='bert_embedding')
input_text = tf.keras.Input((), dtype=tf.string, name='input_text')
embedding = module(input_text)

reshape = tf.keras.layers.Reshape(target_shape=(512, 1))(embedding)
conv1 = tf.keras.layers.Conv1D(filters, kernel, padding='valid', activation='relu', strides=1)(reshape)
gpool1 = tf.keras.layers.GlobalMaxPooling1D()(conv1)
dense1 = tf.keras.layers.Dense(dims, activation="relu")(gpool1)
dropout1 = tf.keras.layers.Dropout(0.2)(dense1)
layer1 = tf.keras.layers.Dense(n_classes, name='sentiment')(dropout1)
model = tf.keras.models.Model(inputs=input_text, outputs=layer1)
0 голосов
/ 23 марта 2020

Вы можете добавить слой Reshape, чтобы изменить форму с [ None , 512 ] на [ None , 512 , 1 ].

import tensorflow as tf
import tensorflow_hub as hub


ml_module = hub.load('https://tfhub.dev/google/universal-sentence-encoder-multilingual/3')
module = hub.KerasLayer(ml_module , dtype=tf.string, trainable=False, name='bert_embedding')
input_text = tf.keras.Input((), dtype=tf.string, name='input_text')
embedding = module(input_text)

reshape = tf.keras.layers.Reshape( target_shape=( None , 512 , 1 ) )( embedding )

conv1 = tf.keras.layers.Conv1D(32, 2, padding='valid', activation='relu', strides=1)(reshape)
dense1 = tf.keras.layers.Dense(512, activation="relu")(conv1)
layer1 = tf.keras.layers.Dense(9, name='sentiment')(dense1)
model = tf.keras.models.Model(inputs=input_text, outputs=layer1)
...