我正在尝试在keras中创建一个简单的有状态神经网络,以包围如何连接嵌入层和LSTM。我有一段文字,我将每个字符映射到一个整数,并希望一次发送一个字符来预测下一个字符。我之前已经这样做了,我一次发送了8个字符并使其运行良好(使用return_sequences=True
和TimeDistributed(Dense)
)。但这次我想一次只发送一个字符,这就是我的问题出现的地方。
我用来设置模型的代码:
n_fac = 32
vocab_size = len(chars)
n_hidden = 256
batch_size=64
model = Sequential()
model.add(Embedding(vocab_size,n_fac,input_length=1,batch_input_shape=(batch_size,1)))
model.add(BatchNormalization())
model.add(LSTM(n_hidden,stateful=True))
model.add(Dense(vocab_size,activation='softmax'))
model.summary()给出了以下内容:
Layer (type) Output Shape Param # Connected to
embedding_1 (Embedding) (64, 1, 32) 992 embedding_input_1[0][0]
batchnormalization_1 (BatchNorma (64, 1, 32) 128 embedding_1[0][0]
lstm_1 (LSTM) (64, 256) 295936 batchnormalization_1[0][0]
dense_1 (Dense) (64, 31) 7967 lstm_1[0][0]
Total params: 305,023
Trainable params: 304,959
Non-trainable params: 64
我用来设置训练数据的代码:
text = ... #Omitted for simplicity. Just setting text to some kind of literature work
text = text.lower() #Simple model, therefor only using lower case characters
idx2char = list(set(list(text)))
char2idx = {char:idx for idx,char in enumerate(idx2char)}
text_in_idx = [char2idx[char] for char in text]
x = text_idx[:-1]
y = text_idx[1:]
编译和训练我的网络:
model.compile(optimizer=Adam(lr=1e-4),loss='sparse_categorical_crossentropy')
nb_epoch = 10
for i in range(nb_epoch):
model.reset_states()
model.fit(x,y,nb_epoch=1,batch_size=batch_size,shuffle=False)
培训按预期进行,每个时期的损失都会减少。
现在我想尝试我训练有素的网络,但不知道如何给它预测下一个角色。我首先重置其状态,然后一次开始给它一个字符。
我尝试了几个不同的输入,但所有输入都失败了。这些都不是合格的猜测。
#The model uses integers for characters, therefor integers are sent as input
model.predict([1]) #Type error
model.predict(np.array([1])) #Value error
model.predict(np.array([1])[np.newaxis,:]) #Value error
model.predict(np.array([1])[:,np.newaxis]) #Value error
我是否被迫发送了一些长度为batch_size的内容,或者我该如何发送模型数据来预测某些内容?
值错误的错误文本非常长且模糊,所以我省略了它。如果需要,我可以提供它。
将theano后端与keras一起使用。