gpt4 book ai didi

deep-learning - keras中的可变长度输出

转载 作者:行者123 更新时间:2023-12-01 04:47:38 26 4
gpt4 key购买 nike

我正在尝试在 keras 中创建一个带有分桶的自动编码器,其中输入和输出具有不同的时间步长。

model = Sequential()

#encoder
model.add(Embedding(vocab_size, embedding_size, mask_zero=True))
model.add(LSTM(units=hidden_size, return_sequences=False))

#decoder
model.add(RepeatVector(max_out_length))
model.add(LSTM(units=hidden_size, return_sequences=True))
model.add(TimeDistributed(Dense(num_class, activation='softmax')))

对于输入没有问题,因为只要整个批次具有相同的长度,网络就可以接受不同长度的输入。然而,问题在于输出大小由 RepeatVector 长度决定,并且没有简单的方法来改变它。

有没有办法解决这样的问题?

最佳答案

如果您的意思是“具有可变长度的输入”和“与输入具有相同长度的输出”,您可以这样做:

Warning: this solution must work with batch size = 1
You will need to create an external loop and pass each sample as a numpy array with the exact length
You cannot use masking in this solution, and the right output depends on the correct length of the input



这是使用 Keras + Tensorflow 的工作代码:

进口:
from keras.layers import *
from keras.models import Model
import numpy as np
import keras.backend as K
from keras.utils.np_utils import to_categorical

要在 Lambda 层中使用的自定义函数:
#this function gets the length from the original input 
#and stores it in the final output of the encoder
def storeLength(x):
inputTensor = x[0]
storeInto = x[1] #the final output

length = K.shape(inputTensor)[1]
length = K.cast(length,K.floatx())
length = K.reshape(length,(1,1))

#will put length as the first element in the final output
return K.concatenate([length,storeInto])


#this function expands the length of the input in the decoder
def expandLength(x):
#lenght is the first element in the encoded input
length = K.cast(x[0,0],'int32') #or int64 if necessary

#the remaining elements are the actual data to be decoded
data = x[:,1:]

#a tensor with shape (length,)
length = K.ones_like(K.arange(0,length))

#make both length tensor and data tensor 3D and with paired dimensions
length = K.cast(K.reshape(length,(1,-1,1)),K.floatx())
data = K.reshape(data,(1,1,-1))

#this automatically repeats the elements based on the paired shapes
return data*length

创建模型:

我假设输出等于输入,但是由于您使用的是嵌入,因此我将“num_classes”设置为等于单词数。

对于这个解决方案,我们使用了分支,因此我不得不使用函数式 API Model .以后会更好,因为你会想用 autoencoder.train_on_batch 训练然后用 encoder.predict() 编码或者只是用 decoder.predict() 解码.
vocab_size = 100
embedding_size = 7
num_class=vocab_size
hidden_size = 3

#encoder
inputs = Input(batch_shape = (1,None))
outputs = Embedding(vocab_size, embedding_size)(inputs)
outputs = LSTM(units=hidden_size, return_sequences=False)(outputs)
outputs = Lambda(storeLength)([inputs,outputs])
encoder = Model(inputs,outputs)

#decoder
inputs = Input(batch_shape=(1,hidden_size+1))
outputs = Lambda(expandLength)(inputs)
outputs = LSTM(units=hidden_size, return_sequences=True)(outputs)
outputs = TimeDistributed(Dense(num_class, activation='softmax'))(outputs)
decoder = Model(inputs,outputs)

#autoencoder
inputs = Input(batch_shape=(1,None))
outputs = encoder(inputs)
outputs = decoder(outputs)
autoencoder = Model(inputs,outputs)

#see each model's shapes
encoder.summary()
decoder.summary()
autoencoder.summary()

只是一个假数据的例子和应该用于训练的方法:
inputData = []
outputData = []
for i in range(7,10):
inp = np.arange(i).reshape((1,i))
inputData.append(inp)

outputData.append(to_categorical(inp,num_class))

autoencoder.compile(loss='mse',optimizer='adam')

for epoch in range(1):
for inputSample,outputSample in zip(inputData,outputData):

print(inputSample.shape,outputSample.shape)
autoencoder.train_on_batch(inputSample,outputSample)

for inputSample in inputData:
print(autoencoder.predict(inputSample).shape)

关于deep-learning - keras中的可变长度输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45117831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com