Ошибка универсального кодировщика предложений: вход 0 несовместим со слоем conv1d_6: ожидаемый ndim = 3, найденный ndim = 2 - PullRequest
0 голосов
/ 07 января 2019

Я работаю над задачей анализа настроений с использованием универсального кодировщика предложений embed_size = 512 с CNN, но у меня есть сообщение об ошибке: Вход 0 несовместим со слоем conv1d_6: ожидаемый ndim = 3, найденный ndim = 2. и хотите знать, правильно ли добавлять универсальный кодировщик предложений с CNN таким образом или нет?

pickle_in=open("X.pickle","rb")
X=pickle.load(pickle_in)

X = X.tolist() #convert x to list as The embedding code works once I 
converted 
the pandas.series data type to list.
X = np.array(X, dtype=object)[:, np.newaxis]
pickle_in=open("Y.pickle","rb")
Y=pickle.load(pickle_in)
Y = np.asarray(pd.get_dummies(Y), dtype = np.int8)

import tensorflow as tf
import tensorflow_hub as hub
module_url = "https://tfhub.dev/google/universal-sentence-encoder-large/3"
embed = hub.Module(module_url)

X_train, X_test, Y_train, Y_test = train_test_split(X,Y, test_size = 0.15, 

random_state = 42)
X_train, X_Val, Y_train, Y_Val = train_test_split(X_train,Y_train, test_size 
= 0.15, random_state = 42)
print(X_train.shape,Y_train.shape)
print(X_test.shape,Y_test.shape)
print(X_Val.shape,Y_Val.shape)
type(Y_test)

embed_size = embed.get_output_info_dict()['default'].get_shape()[1].value
def UniversalEmbedding(x):
return embed(tf.squeeze(tf.cast(x, tf.string)), 
    signature="default", as_dict=True)["default"]

import keras

seed=7
np.random.seed(seed)

from keras.layers import Input, Dense, concatenate, Activation, 
GlobalMaxPooling1D
from keras import layers
from keras.models import Model

input_text = layers.Input(shape=(1,), dtype=tf.string)
embedding = layers.Lambda(UniversalEmbedding,
    output_shape=(embed_size,))(input_text)

bigram_branch = Conv1D(filters=64, kernel_size=1, padding='same', 
activation='relu', strides=1)(embedding)
bigram_branch = GlobalMaxPooling1D()(bigram_branch)
trigram_branch = Conv1D(filters=64, kernel_size=2, padding='same', 
activation='relu', strides=1)(embedding)
trigram_branch = GlobalMaxPooling1D()(trigram_branch)
fourgram_branch = Conv1D(filters=64, kernel_size=3, padding='same', 
activation='relu', strides=1)(embedding)
fourgram_branch = GlobalMaxPooling1D()(fourgram_branch)
merged = concatenate([bigram_branch, trigram_branch, fourgram_branch], 
axis=1)

merged = Dense(512, activation='relu')(merged)
merged = Dropout(0.8)(merged)
merged = Dense(2)(merged)
output = Activation('sigmoid')(merged)
model = Model(inputs=[tweet_input], outputs=[output])
adam=keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, 
decay=0.0, amsgrad=False)
model.compile(loss='mean_squared_error',
                  optimizer= adam,
                  metrics=['accuracy'])
model.summary()

1 Ответ

0 голосов
/ 07 января 2019

Вы не можете напрямую передать Universal Sentence Encoder в Conv1D, потому что Conv1D ожидал тензор с формой [batch, sequence, feature], а выход Universal Sentence Encoder равен [batch, feature]. Это также указано в tfhub.dev :

Ввод английского текста переменной длины и вывод 512 мерный вектор.

Как я могу это исправить?

На мой взгляд, самое простое решение - это использовать ELMo на Tensorhub. С ELMo вы можете сопоставить каждое предложение с [batch, sequence, feature] и затем добавить его в Conv1D.

...