我正在阅读this文章(循环神经网络的不合理有效性),并想了解如何表达一对一,一对多,多对一和多对多的表达Keras中的许多LSTM神经网络。我已经阅读了很多有关RNN的文章,并了解了LSTM NN的工作原理,尤其是消失的梯度,LSTM单元,它们的输出和状态,序列输出等。但是,我很难在Keras中表达所有这些概念。
首先,我使用LSTM层创建了以下玩具NN
from keras.models import Model
from keras.layers import Input, LSTM
import numpy as np
t1 = Input(shape=(2, 3))
t2 = LSTM(1)(t1)
model = Model(inputs=t1, outputs=t2)
inp = np.array([[[1,2,3],[4,5,6]]])
model.predict(inp)
输出:
array([[ 0.0264638]], dtype=float32)
在我的示例中,输入形状为2 x3。据我所知,这意味着输入是2个向量的序列,每个向量具有3个特征,因此我的输入必须是形状为{{ 1}}。就“序列”而言,输入是一个长度为2的序列,序列中的每个元素都由3个特征表示(如果我错了,请纠正我)。当我调用(n_examples, 2, 3)
时,它将返回带有单个标量的2维张量。所以,
Q1:它是一对一还是另一种LSTM网络?
当我们说“一个/多个输入和一个/多个输出”
Q2:“一个/多个输入/输出”是什么意思? “一个/很多”标量,向量,序列...,一个/很多什么?
Q3:有人可以在Keras中为每种类型的网络(1-1、1-M,M-1和M-M)给出一个简单的工作示例吗?
PS:我在一个线程中问了多个问题,因为它们非常接近并且彼此相关。
答案 0 :(得分:3)
一对一,一对多,一对多,一对多的区别-many 仅在RNN / LSTM或使用顺序(时间)数据的网络中存在,而CNN使用空间数据的情况下存在,这种区别不存在存在。所以很多总是涉及多个时间步长 /一个顺序
不同种类描述输入和输出的形状及其分类。对于输入 one 表示将单个输入量分类为封闭量,而许多表示将一系列量(即图像序列,单词序列)分类为封闭数量。对于输出 one 表示输出是标量(二进制分类,即是鸟或不是鸟)0
或1
,很多表示输出是一个单热编码矢量,每个类别都有一个维度(多类别分类,即是麻雀 ,是一个知更鸟,...),例如三个类001, 010, 100
:
在以下示例中,图像和图像序列用作应分类的数量,或者,您可以使用单词或...,以及单词(句子)或...的序列:
一对一:将单个图像(或单词,...)归为单一类(二进制分类),即这是否是鸟
一对多:单个图像(或单词,...)被分为多个类别
多对一:图像序列(或单词,...)被归为单一类别(序列的二进制分类)
多对多:图像序列(或单词,...)被分为多个类别
一对一(activation=sigmoid
(默认)loss=mean_squared_error
)
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
# prepare sequence
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)
# define LSTM configuration
n_neurons = length
n_batch = length
n_epoch = 1000
# create LSTM
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())
# train LSTM
model.fit(X, y, epochs=n_epoch, batch_size=n_batch, verbose=2)
# evaluate
result = model.predict(X, batch_size=n_batch, verbose=0)
for value in result:
print('%.1f' % value)
一对多使用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)
# print relative_error, '\n', keras_preds, '\n', coreml_preds, '\n'
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))
来源: Many to one and many to many LSTM examples in Keras
多对一,二进制分类({{1},loss=binary_crossentropy
,完全连接的输出层的维数是1({{ 1}}),输出标量activation=sigmoid
或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)
# Final evaluation of the model
scores = model.evaluate(X_test, y_test, verbose=0)
,需要对目标,地面真实数据,全连接输出层的维数为7(loss=sparse_categorial_crossentropy
)输出7维向量,其中7个类是一热编码的)
activation=softmax
cf Keras LSTM multiclass classification
使用Dense71)
层cf https://machinelearningmastery.com/timedistributed-layer-for-long-short-term-memory-networks-in-python/进行描述的多对多替代
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()