我正在按照一个关于非洲语言词性标注器的教程,该教程使用基于LSTM的分类器。在运行代码时:
import pandas as pdimport numpy as npfrom keras.preprocessing import sequencefrom keras.utils import to_categoricalfrom sklearn.model_selection import train_test_splitfrom keras.models import Sequentialfrom keras.layers import Dense, LSTM, SimpleRNN, Flattenfrom keras.layers.embeddings import Embeddingfrom tensorflow.keras.callbacks import EarlyStopping#from keras.callbacks import EarlyStopping# 加载英文-耶姆巴词典为CSV文件df = pd.read_csv('dict_en_yb.csv')# 显示一些词对df.sample(frac=.1).head(15)nb_labels = len(df.word_type.unique())nb_words = df.shape[0]# 创建字母到标记的字典chars = sorted(list(set(' '.join(df.yb))))letter2idx = dict((c, i+1) for i, c in enumerate(chars))# 创建标记到字母的字典idx2letter = dict((i, c) for c, i in letter2idx.items())vocabulary_size = len(letter2idx)+1print("词汇量大小: ", vocabulary_size)X = []Y = []max_len = 0for i, r in df.iterrows(): word_vector = [letter2idx[c] for c in set(r.yb)] label = r.word_type if len(word_vector)>max_len: max_len = len(word_vector) X_max = word_vector Y_max = label X.append(word_vector) Y.append(label)X = sequence.pad_sequences(X, maxlen=max_len)Y = to_categorical(Y)X.shape, Y.shapeX_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=.2, shuffle=True, random_state=999)print("训练使用 {} 个词,验证使用 {} 个词".format(X_train.shape[0], X_test.shape[0]))# 构建一个带有100个单元的单层LSTM并嵌入embedding_dim = 8model_lstm = Sequential()model_lstm.add(Embedding(vocabulary_size, embedding_dim, input_length=max_len))model_lstm.add(LSTM(100))model_lstm.add(Dense(nb_labels, activation='sigmoid'))model_lstm.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])model_lstm.summary()# 训练网络early_stopping = EarlyStopping(monitor='val_acc', min_delta=0,patience=5,verbose=1, mode='auto')history_lstm = model_lstm.fit(X_train, Y_train, epochs=50, batch_size=32, validation_data=(X_test, Y_test), callbacks=[early_stopping])scores_lstm = model_lstm.evaluate(X_test, Y_test, verbose=0)
我得到了以下错误:
File "testing.py", line 64, in <module> callbacks=[early_stopping])...ValueError: logits和labels必须具有相同的形状((None, 10) 与 (None, 12))
看起来这与最终的Dense层中的神经元数(12)有关,这些神经元与10个类别不对应,但我不知道如何修复它。
标题
回答:
将nb_labels
的值更改为10,并将激活函数设置为’softmax’。Sigmoid适用于二元情况。