我对keras和python都是新手。我有一个具有不同序列长度的时间序列数据集(例如,第一个序列是484000x128,第二个序列是563110x128,依此类推)我已将这些序列放入3D数组中。
我的问题是如何定义输入形状,因为我很困惑。我使用的是DL4J,但是概念在定义网络配置方面有所不同。
这是我的第一个试用代码:
import numpy as np
from keras.models import Sequential
from keras.layers import Embedding,LSTM,Dense,Dropout
## Loading dummy data
sequences = np.array([[[1,2,3],[1,2,3]], [[4,5,6],[4,5,6],[4,5,6]]])
y = np.array([[[0],[0]], [[1],[1],[1]]])
x_test=np.array([[2,3,2],[4,6,7],[1,2,1]])
y_test=np.array([0,1,1])
n_epochs=40
# model configration
model = Sequential()
model.add(LSTM(100, input_shape=(3,1), activation='tanh', recurrent_activation='hard_sigmoid')) # 100 num of LSTM units
model.add(LSTM(100, activation='tanh', recurrent_activation='hard_sigmoid'))
model.add(Dense(1, activation='softmax'))
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
print(model.summary())
## training with batches of size 1 (each batch is a sequence)
for epoch in range(n_epochs):
for seq, label in zip(sequences, y):
model.train(np.array([seq]), [label]) # train a batch at a time..
scores=model.evaluate(x_test, y_test) # evaluate batch at a time..
Run Code Online (Sandbox Code Playgroud)
这是有关LSTM输入形状的文档:
输入形状
形状为(batch_size,timesteps,input_dim)的3D张量,(可选)形状为(batch_size,output_dim)的2D张量。
这意味着您将需要每个批次的大小不变的时间步长。
做到这一点的标准方法是使用keras的padding实用程序来填充序列
那么您可以尝试:
# let say timestep you choose: is 700000 and dimension of the vectors are 128
timestep = 700000
dims = 128
model.add(LSTM(100, input_shape=(timestep, dim),
activation='tanh', recurrent_activation='hard_sigmoid'))
Run Code Online (Sandbox Code Playgroud)
我编辑了答案以删除batch_size参数。通过此设置,批次大小是未指定的,您可以在拟合模型时(在中model.fit())进行设置。
| 归档时间: |
|
| 查看次数: |
8950 次 |
| 最近记录: |