这里的
一对一,
一对多,
多对一,
多对多仅存在于RNN / LSTM或处理
顺序(时间)数据的网络中,CNN处理
空间数据,因此不存在这种区别。所以
多总是涉及
多个时间步长 /
序列。
不同的类型描述了输入和输出的形状及其分类。对于输入,
一个意味着单个输入量被分类为封闭数量,而
多个意味着一系列数量(即图像序列,单词序列)被分类为封闭数量。对于输出,
一个表示输出是标量(二元分类,即
是鸟或
不是鸟),
0
或
1
,
多个表示输出是
one-hot编码向量,每个类别都有一个维度(多类分类,即
是麻雀,
是知更鸟,...),例如三个类别:
001, 010, 100
:
在下面的示例中,使用图像和图像序列作为要分类的量,或者您可以使用单词或...和单词序列(句子)或...:
一对一:单个图像(或单词,...)被分类为单个类别(二元分类),即这是一只鸟还是不是。
一对多:单个图像(或单词等)属于多个类别
多对一:图像序列(或单词等)被分类为单个类别(序列的二元分类)
多对多:图像序列(或单词等)被分类为多个类别
参见 https://www.quora.com/How-can-I-choose-between-one-to-one-one-to-many-many-to-one-many-to-one-and-many-to-many-in-long-short-term-memory-LSTM
一对一(激活函数=sigmoid
(默认值)损失函数=均方误差
)
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
length = 5
seq = array([i/float(length) for i in range(length)])
X = seq.reshape(len(seq), 1, 1)
y = seq.reshape(len(seq), 1)
n_neurons = length
n_batch = length
n_epoch = 1000
model = Sequential()
model.add(LSTM(n_neurons, input_shape=(1, 1)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
print(model.summary())
model.fit(X, y, epochs=n_epoch, batch_size=n_batch, verbose=2)
result = model.predict(X, batch_size=n_batch, verbose=0)
for value in result:
print('%.1f' % value)
来源: https://machinelearningmastery.com/timedistributed-layer-for-long-short-term-memory-networks-in-python/
该文章介绍了如何在Python中使用TimeDistributed层来提高长短时记忆网络的性能。它解释了什么是TimeDistributed层以及如何将其与LSTM网络结合使用。本文还提供了示例代码和说明,帮助读者更好地理解如何实现这些技术。
one-to-many 使用RepeatVector()
将单个量转换为序列,这对于多类分类非常必要。
def test_one_to_many(self):
params = dict(
input_dims=[1, 10], activation='tanh',
return_sequences=False, output_dim=3
),
number_of_times = 4
model = Sequential()
model.add(RepeatVector(number_of_times, input_shape=(10,)))
model.add(LSTM(output_dim=params[0]['output_dim'],
activation=params[0]['activation'],
inner_activation='sigmoid',
return_sequences=True,
))
relative_error, keras_preds, coreml_preds = simple_model_eval(params, model)
for i in range(len(relative_error)):
self.assertLessEqual(relative_error[i], 0.01)
来源:https://www.programcreek.com/python/example/89689/keras.layers.RepeatVector
备选项一对多
model.add(RepeatVector(number_of_times, input_shape=input_shape))
model.add(LSTM(output_size, return_sequences=True))
来源: Keras中的一对多和多对多LSTM示例
多对一,二元分类(loss=binary_crossentropy
,activation=sigmoid
,全连接输出层的维度为1(Dense(1)
),输出标量,0
或1
)
model = Sequential()
model.add(Embedding(5000, 32, input_length=500))
model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(X_train, y_train, epochs=3, batch_size=64)
scores = model.evaluate(X_test, y_test, verbose=0)
多对多,多类分类(loss=sparse_categorial_crossentropy
,activation=softmax
,需要对目标、真实数据进行独热编码,完全连接输出层的维度为7(Dense71
),输出一个7维向量,其中7个类别被独热编码。
from keras.models import Sequential
from keras.layers import *
model = Sequential()
model.add(Embedding(5000, 32, input_length=500))
model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(7, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
cf Keras LSTM多类分类
使用TimeDistributed
层的备选多对多,参见https://machinelearningmastery.com/timedistributed-layer-for-long-short-term-memory-networks-in-python/以了解描述
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import TimeDistributed
from keras.layers import LSTM
length = 5
seq = array([i/float(length) for i in range(length)])
X = seq.reshape(1, length, 1)
y = seq.reshape(1, length, 1)
n_neurons = length
n_batch = 1
n_epoch = 1000
model = Sequential()
model.add(LSTM(n_neurons, input_shape=(length, 1), return_sequences=True))
model.add(TimeDistributed(Dense(1)))
model.compile(loss='mean_squared_error', optimizer='adam')
print(model.summary())
model.fit(X, y, epochs=n_epoch, batch_size=n_batch, verbose=2)
result = model.predict(X, batch_size=n_batch, verbose=0)
for value in result[0,:,0]:
print('%.1f' % value)
来源: https://machinelearningmastery.com/timedistributed-layer-for-long-short-term-memory-networks-in-python/
时间分布层是一种在长短时记忆网络中广泛使用的技术。它允许模型对序列数据进行逐步处理,并将输出传递到下一层。本教程将介绍如何使用Keras库中的时间分布层来改进LSTM模型。