Keras 上的多维度 Y_train
Multi Dimension Y_train on Keras
我有 x_train 和 y_train 的 2 个语料库,经过这样的处理后:
input_sequences = []
labels = []
indexCA = 0
for line in corpusMSA:
lineCA = corpusCA[indexCA].split() # Save CA Line
token_list = tokenizer.texts_to_sequences([line])[0] # Tokenize line
for i in range(1, len(token_list)):
n_gram_sequence = token_list[:i+1] # Generate ngrams (n=2)
n_gram_label = lineCA[:i+1]
input_sequences.append(n_gram_sequence)
labels.append(n_gram_label)
indexCA+=1
# pad sequences
max_sequence_len = max([len(x) for x in input_sequences])
input_sequences = np.array(pad_sequences(input_sequences, maxlen=max_sequence_len, padding='pre'))
max_labels_len = max([len(x) for x in labels])
labels = np.array(pad_sequences(labels, maxlen=max_labels_len, padding='pre'))
# create predictors and label
xs = input_sequences
ys = tf.keras.utils.to_categorical(labels, num_classes=16)
两个数据集的原始形状都是 (1098360, 14),但在使用 utils.to_categorical() 方法后 y_train 形状变为 (1098360, 14, 16)。
我有 2 个双向 LSTM 层:
model.add(Embedding(total_words, 100, input_length=max_sequence_len))
model.add(Bidirectional(LSTM(256, return_sequences=True)))
model.add(Bidirectional(LSTM(128)))
model.add(Dense(16, activation='softmax'))
adam = Adam(lr=0.01)
model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])
history = model.fit(x_train, y_train, epochs=20, batch_size=size_batch, verbose=1, callbacks=[tensorboard])
我有这个错误:形状为 (1098360, 14, 16) 的目标数组被传递给形状为 (None, 16) 的输出,同时用作损失 categorical_crossentropy
。此损失期望目标与输出具有相同的形状。
如何告诉我的模型输出形状是 (None,14,16)?
y_train
在调用 to_categorical
之前似乎已经是一个向量,因此您不需要使用 to_categorical
但是,如果该向量包含多个 class在 mutlilabel classification 的情况下,你需要使用 to_categorical
然后使用 np.sum(axis=1)
最终结果是这样的:
y_train = to_categorical(y_train, num_classes=16).sum(axis=1)
我有 x_train 和 y_train 的 2 个语料库,经过这样的处理后:
input_sequences = []
labels = []
indexCA = 0
for line in corpusMSA:
lineCA = corpusCA[indexCA].split() # Save CA Line
token_list = tokenizer.texts_to_sequences([line])[0] # Tokenize line
for i in range(1, len(token_list)):
n_gram_sequence = token_list[:i+1] # Generate ngrams (n=2)
n_gram_label = lineCA[:i+1]
input_sequences.append(n_gram_sequence)
labels.append(n_gram_label)
indexCA+=1
# pad sequences
max_sequence_len = max([len(x) for x in input_sequences])
input_sequences = np.array(pad_sequences(input_sequences, maxlen=max_sequence_len, padding='pre'))
max_labels_len = max([len(x) for x in labels])
labels = np.array(pad_sequences(labels, maxlen=max_labels_len, padding='pre'))
# create predictors and label
xs = input_sequences
ys = tf.keras.utils.to_categorical(labels, num_classes=16)
两个数据集的原始形状都是 (1098360, 14),但在使用 utils.to_categorical() 方法后 y_train 形状变为 (1098360, 14, 16)。
我有 2 个双向 LSTM 层:
model.add(Embedding(total_words, 100, input_length=max_sequence_len))
model.add(Bidirectional(LSTM(256, return_sequences=True)))
model.add(Bidirectional(LSTM(128)))
model.add(Dense(16, activation='softmax'))
adam = Adam(lr=0.01)
model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])
history = model.fit(x_train, y_train, epochs=20, batch_size=size_batch, verbose=1, callbacks=[tensorboard])
我有这个错误:形状为 (1098360, 14, 16) 的目标数组被传递给形状为 (None, 16) 的输出,同时用作损失 categorical_crossentropy
。此损失期望目标与输出具有相同的形状。
如何告诉我的模型输出形状是 (None,14,16)?
y_train
在调用 to_categorical
之前似乎已经是一个向量,因此您不需要使用 to_categorical
但是,如果该向量包含多个 class在 mutlilabel classification 的情况下,你需要使用 to_categorical
然后使用 np.sum(axis=1)
最终结果是这样的:
y_train = to_categorical(y_train, num_classes=16).sum(axis=1)