考虑一维numpy数组。可以通过改变阵列的形状和步幅来模拟该阵列上的滑动窗口。例如,考虑我们应用两个滑动窗口的半抛物线:
data = numpy.arange(20)
data **= 2
item_size = data.itemsize
data_input = numpy.ndarray(
buffer = data.data,
dtype = data.dtype,
shape = (data.shape[0] - 4 + 1, 2),
strides = (item_size, item_size),
offset = 0
)
data_output = numpy.ndarray(
buffer = data.data,
dtype = data.dtype,
shape = (data.shape[0] - 4 + 1, 2),
strides = (item_size, item_size),
offset = 2 * item_size
)
此处data_input
中的每一行都在data_output
中有一个匹配的行,该行在data
中相互排在前面。那就是:
list(zip(data_input.tolist(), data_output.tolist()))
输出是输入和输出的行元组,我们很快就会适应神经网络。
[([ 0, 1], [ 4, 9]),
([ 1, 4], [ 9, 16]),
([ 4, 9], [ 16, 25]),
([ 9, 16], [ 25, 36]),
([ 16, 25], [ 36, 49]),
([ 25, 36], [ 49, 64]),
([ 36, 49], [ 64, 81]),
([ 49, 64], [ 81, 100]),
([ 64, 81], [100, 121]),
([ 81, 100], [121, 144]),
([100, 121], [144, 169]),
([121, 144], [169, 196]),
([144, 169], [196, 225]),
([169, 196], [225, 256]),
([196, 225], [256, 289]),
([225, 256], [289, 324]),
([256, 289], [324, 361])]
请注意,上面显示的2 1
指的是相同的内存。也就是说,我们创建了一个滑动窗口视图而不是副本。所有4
,所有9
等都是如此。
我想知道使用它们训练Keras神经网络是否安全。例如:
from keras.models import Sequential
from keras.layers.core import Dense, Activation
from keras.optimizers import SGD
model = Sequential()
model.add(Dense(output_dim=3, input_dim=2, init="glorot_uniform"))
model.add(Activation('linear'))
model.add(Dense(output_dim=2, input_dim=3, init="glorot_uniform"))
model.add(Activation('linear'))
model.compile(loss='mse', optimizer=SGD(lr=0.000001, momentum=0.9, nesterov=True))
model.fit(data_input, data_output, nb_epoch=100000, batch_size=32, verbose=0)
numpy.sqrt( ((model.predict(data_input) - data_output) ** 2).mean() )
代码似乎有效,因为权重的正常值介于-2和2之间,结果RMSE大约为0.65。
然而,我可能会推动我的运气。 Keras是否认为
numpy.zeros(...)
创建的值请不要单独使用替代方法来回答所有窗口,也不要使用其他库。
我想知道使用这样的Keras是否安全,以及结果是否与数据完全实现时的结果相同。如果答案取决于后端,请回答后端(Theano / Tensorflow)。