简单的有状态nn Keras,可以适合模型但不能预测

时间:2017-08-02 14:17:43

标签: python neural-network keras lstm

我正在尝试在keras中创建一个简单的有状态神经网络,以包围如何连接嵌入层和LSTM。我有一段文字,我将每个字符映射到一个整数,并希望一次发送一个字符来预测下一个字符。我之前已经这样做了,我一次发送了8个字符并使其运行良好(使用return_sequences=TrueTimeDistributed(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一起使用。

0 个答案:

没有答案