Neural network 使用Keras-LSTM在使用批训练后预测单个示例

Neural network 使用Keras-LSTM在使用批训练后预测单个示例,neural-network,keras,lstm,recurrent-neural-network,Neural Network,Keras,Lstm,Recurrent Neural Network,我有一个网络模型,它是使用批训练进行训练的。一旦训练完成,我想预测一个例子的输出 这是我的型号代码: model = Sequential() model.add(Dense(32, batch_input_shape=(5, 1, 1))) model.add(LSTM(16, stateful=True)) model.add(Dense(1, activation='linear')) model.compile(loss='mean_squared_error', optimizer='

我有一个网络模型,它是使用批训练进行训练的。一旦训练完成,我想预测一个例子的输出

这是我的型号代码:

model = Sequential()
model.add(Dense(32, batch_input_shape=(5, 1, 1)))
model.add(LSTM(16, stateful=True))
model.add(Dense(1, activation='linear'))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
我有一个从单输入到单输出的序列。我正在做一些测试代码来将字符映射到下一个字符(A->B,B->C,等等)

我创建形状(15,1,1)的输入数据和形状(15,1)的输出数据,并调用函数:

model.fit(x, y, nb_epoch=epochs, batch_size=5, shuffle=False, verbose=0)
这个模型训练,现在我想用一个字符预测下一个字符(输入a,它预测B)。我创建一个shape(1,1,1)输入并调用:

pred = model.predict(x, batch_size=1, verbose=0)
这使得:

ValueError: Shape mismatch: x has 5 rows but z has 1 rows
我看到一种解决方案是将“虚拟数据”添加到预测值中,因此预测的输入形状将是(5,1,1)和数据[x0],您只需将输出的第一个元素作为您的值。但是,在处理较大批次时,这似乎效率低下

我还尝试从模型创建中删除批量大小,但收到以下消息:

ValueError: If a RNN is stateful, a complete input_shape must be provided (including batch size).
还有别的办法吗?感谢您的帮助。

目前(Keras v2.0.8),在批量训练后,要获得单行预测需要付出更多的努力

基本上,批量大小在训练时是固定的,在预测时必须相同

现在的解决方法是从经过训练的模型中获取权重,并将其用作刚刚创建的新模型中的权重,该模型的批处理大小为1

这方面的快速代码是

model = create_model(batch_size=64)
mode.fit(X, y)
weights = model.get_weights()
single_item_model = create_model(batch_size=1)
single_item_model.set_weights(weights)
single_item_model.compile(compile_params)
以下是一篇更深入的博文:


我过去使用过这种方法在预测时有多个模型——一个对大批量进行预测,一个对小批量进行预测,还有一个对单个项目进行预测。由于批处理预测效率更高,这使我们可以灵活地接受任意数量的预测行(而不仅仅是一个可以被批处理大小平均整除的数字),同时仍然可以非常快速地获得预测。

@grampsrocks展示了一个很好的解决方法。我不能提供“Keras打算这样做”意义上的“正确”答案,但我可以分享另一种解决方法,这可能会根据用例帮助某些人

在这个解决方法中,我使用
predict\u on\u batch()
。此方法允许从批次中传递单个样本,而不会引发错误。不幸的是,它根据训练设置返回目标形状的向量。但是,目标中的每个样本都会生成单个样本的预测

您可以这样访问它:

to_predict=#某个将成为批次一部分的单个样本(必须具有正确的形状)#
model.predict_on_batch(to_predict)[0]。展平()#展平是可选的
预测结果与将整个批次传递给
predict()
完全相同


这里是一些cod示例。 这段代码也是用来处理这个问题的(但方式略有不同)

sequence\u size=5
功能的数量=1
输入=(序列大小、特征数量)
批量大小=2
模型=顺序()
#当然,您可以用LSTM层替换选通循环单元
添加(GRU(100,返回序列=True,激活=relu',输入形状=input,批量大小=2,name=“GRU”))
添加(GRU(1,返回序列=True,激活=relu',输入形状=input,批大小=batch大小,name=“GRU2”))
compile(优化器='adam',loss='mse')
model.summary()
#摘要产出:
_________________________________________________________________
层(类型)输出形状参数
=================================================================
GRU(GRU)(2,5100)30600
_________________________________________________________________
GRU2(GRU)(2,5,1)306
=================================================================
总参数:30906
可培训参数:30906
不可训练参数:0
def生成器(数据、批次大小、序列大小、数量特征):
“简单生成器”
尽管如此:
对于范围内的i(长度(数据)-(顺序大小*批次大小+顺序大小)+1):
开始=i
end=i+(顺序大小*批次大小)
产量数据[开始:结束]。重塑(批次大小、序列大小、数量特征)\
数据[结束-((序列大小*批次大小)-序列大小):结束+序列大小]。重塑(批次大小、序列大小、数量特征)
#任务:预测线性范围的延续
数据=np.arange(100)
hist=模型拟合\u生成器(
生成器=生成器(数据、批次大小、序列大小、数量特征),
每个历元的步数=总批次,
纪元=200,
洗牌=错误
)
to_predict=np.asarray([[np.asarray([x]),用于范围(95100,1)]内的x)#一批中的单个元素
correct=np.asarray([100101102103104])
打印(批量上的model.predict\u(to\u predict)[0]。展平()
#输出:
[ 99.92908 100.95854 102.32129 103.28584 104.20213 ]

我知道这已经很旧了,但您知道这期间是否发生了变化吗?