我不断从以下代码中获取input_shape错误.
from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM
def _load_data(data):
"""
data should be pd.DataFrame()
"""
n_prev = 10
docX, docY = [], []
for i in range(len(data)-n_prev):
docX.append(data.iloc[i:i+n_prev].as_matrix())
docY.append(data.iloc[i+n_prev].as_matrix())
if not docX:
pass
else:
alsX = np.array(docX)
alsY = np.array(docY)
return alsX, alsY
X, y = _load_data(dframe)
poi = int(len(X) * .8)
X_train = X[:poi]
X_test = X[poi:]
y_train = y[:poi]
y_test = y[poi:]
input_dim = 3
Run Code Online (Sandbox Code Playgroud)
以上所有都顺利进行.这是它出错的地方.
in_out_neurons = 2
hidden_neurons …Run Code Online (Sandbox Code Playgroud) 我想在Keras中实现LSTM用于流时间序列预测 - 即,在线运行,一次获得一个数据点.这在这里得到了很好的解释,但正如人们所假设的那样,在线LSTM的训练时间可能非常慢.我想在迷你批次上训练我的网络,并在线测试(运行预测).在Keras这样做的最佳方法是什么?
例如,小批量可以是[33, 34, 42, 33, 32, 33, 36, ... 24, 23]在连续时间步骤发生的1000个数据值()的序列.为了训练网络,我已经指定了一个X形状数组(900, 100, 1),其中有900个长度为100的序列和一个y形状数组(900, 1).例如,
X[0] = [[33], [34], [42], [33], ...]]
X[1] = [[34], [42], [33], [32], ...]]
...
X[999] = [..., [24]]
y[999] = [23]
Run Code Online (Sandbox Code Playgroud)
因此,对于每个序列X[i],都有一个对应的y[i]代表时间序列中的下一个值 - 我们想要预测的内容.
在测试中,我想预测下一个数据值1000到1999.我通过(1, 100, 1)为1000到1999的每个步骤提供一个形状数组来做到这一点,模型试图在下一步预测值.
这是我的问题的推荐方法和设置吗?启用有状态可能是实现纯粹在线实施的方式,但在Keras中,这需要一致batch_input_shape的培训和测试,这对我的小批量培训和在线测试的意图不利.或者我有办法做到这一点吗?
更新:尝试以@nemo推荐的方式实施网络
我在博客文章"使用Keras的Python中使用LSTM循环神经网络进行时间序列预测"的示例网络上运行了我自己的数据集,然后尝试将预测阶段实现为有状态网络.
模型构建和培训对于两者都是相同的:
# Create and fit the LSTM network
numberOfEpochs = 10 …Run Code Online (Sandbox Code Playgroud) 我正在尝试进行多级分类,这里是我的训练输入和输出的详细信息:
train_input.shape =(1,95000,360)(95000长度输入数组,每个元素是360长度的数组)
train_output.shape =(1,95000,22)(22门课程)
model = Sequential()
model.add(LSTM(22, input_shape=(1, 95000,360)))
model.add(Dense(22, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(train_input, train_output, epochs=2, batch_size=500)
Run Code Online (Sandbox Code Playgroud)
错误是:
ValueError:输入0与层lstm_13不兼容:期望ndim = 3,在行中找到ndim = 4:model.add(LSTM(22,input_shape =(1,95000,360)))
请帮帮我,我无法通过其他答案解决.
受本文的启发,我正在尝试构建一个条件GAN,它将使用LSTM生成MNIST数字.我希望我使用与图像波纹相同的架构(除了本文中的鉴别器中的双向RNN ):
当我运行这个模型时,我得到了非常奇怪的结果.此图显示了我的模型在每个纪元后生成3号.看起来应该更像这样.这真的很糟糕.
我的鉴别器网络的丢失真的快速下降到接近零.然而,我的发电机网络的损失在一些固定点附近振荡(可能缓慢地发散).我真的不知道发生了什么.这是我的代码中最重要的部分(完整代码在这里):
timesteps = 28
X_dim = 28
Z_dim = 100
y_dim = 10
X = tf.placeholder(tf.float32, [None, timesteps, X_dim]) # reshaped MNIST image to 28x28
y = tf.placeholder(tf.float32, [None, y_dim]) # one-hot label
Z = tf.placeholder(tf.float32, [None, timesteps, Z_dim]) # numpy.random.uniform noise in range [-1; 1]
y_timesteps = tf.tile(tf.expand_dims(y, axis=1), [1, timesteps, 1]) # [None, timesteps, y_dim] - replicate y along axis=1
def discriminator(x, y): …Run Code Online (Sandbox Code Playgroud) 我在尝试使用 CuDNNLSTM 而不是 keras.layers.LSTM 时遇到了一个问题。
这是我得到的错误:
无法使用模型配置调用 ThenRnnForward: [rnn_mode, rnn_input_mode, rnn_direction_mode]: 2, 0, 0 , [num_layers, input_size, num_units, dir_count, seq_length, batch_size]: [1, 300, 512, 5528] 1, [1, 1, 1, [{{node bidirectional_1/CudnnRNN_1}} = CudnnRNN[T=DT_FLOAT, _class=["loc:@train...NNBackprop"], direction="unidirectional", dropout=0, input_mode="linear_input", is_training=true , rnn_mode="lstm", seed=87654321, seed2=0, _device="/job:localhost/replica:0/task:0/device:GPU:0"](bidirectional_1/transpose_1, bidirectional_1/ExpandDims_1, bidirectional_1/ExpandDims_1 , bidirectional_1/concat_1)]] [[{{node loss/mul/_75}} = _Recvclient_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device=" /job:localhost/replica:0/task:0/device:GPU:0",send_device_incarnation=1, tensor_name="edge_1209_loss/mul", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]]
另外,我在其中一次运行中遇到了这个错误:
内部错误:GPU 同步失败
每次运行后内核都会死掉。
当我尝试使用 CuDNNLSTM 在谷歌云上的 VM 实例上运行它时,我才开始收到此错误。
我的代码是:
MAX_LEN = max(len(article) for article in X_train_tokens)
EMBEDDING_DIM=300
vocab_size = len(word_to_id)
classes = …Run Code Online (Sandbox Code Playgroud) 我正在尝试在pytorch中训练LSTM层。我正在使用4个GPU。初始化时,我添加了.cuda()函数将隐藏层移动到GPU。但是,当我使用多个GPU运行代码时,出现此运行时错误:
RuntimeError: Input and hidden tensors are not at the same device
Run Code Online (Sandbox Code Playgroud)
我试图通过在以下正向函数中使用.cuda()函数来解决此问题:
self.hidden = (self.hidden[0].type(torch.FloatTensor).cuda(), self.hidden[1].type(torch.FloatTensor).cuda())
Run Code Online (Sandbox Code Playgroud)
这条线似乎可以解决问题,但令我担心的是,是否在不同的GPU中看到了更新的隐藏层。我应该将向量在前进功能的末尾移回cpu进行批处理,还是有其他解决方法?
我有一个由一个 LSTM 和两个 Dense 层组成的简单网络,如下所示:
model = tf.keras.Sequential()
model.add(layers.LSTM(20, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(layers.Dense(20, activation='sigmoid'))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(loss='mean_squared_error')
Run Code Online (Sandbox Code Playgroud)
为了分类,它对具有 3 个输入(归一化 0 到 1.0)和 1 个输出(二进制)的数据进行训练。数据是时间序列数据,其中时间步长之间存在关系。
var1(t) var2(t) var3(t) var4(t)
0 0.448850 0.503847 0.498571 0.0
1 0.450992 0.503480 0.501215 0.0
2 0.451011 0.506655 0.503049 0.0
Run Code Online (Sandbox Code Playgroud)
模型训练如下:
history = model.fit(train_X, train_y, epochs=2800, batch_size=40, validation_data=(test_X, test_y), verbose=2, shuffle=False)
model.summary()
Run Code Online (Sandbox Code Playgroud)
给出模型总结:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm (LSTM) (None, 20) 1920
_________________________________________________________________
dense (Dense) (None, 20) 420
_________________________________________________________________
dense_1 (Dense) …Run Code Online (Sandbox Code Playgroud) 我一直在研究一个使用时间序列数据与天气数据相结合来估计交通流量的项目。我的时间序列使用了 30 个值的窗口,并且使用了 20 个与天气相关的特征。我已经使用函数式 API 来实现此目的,但我不断收到相同的错误,并且我不知道如何解决它。我查看了其他类似的线程,例如层 conv1d_1 的输入 0 与该层不兼容:预期 ndim=3,发现 ndim=2。收到的完整形状:[无,200],但没有帮助。
这是我的模型,
series_input = Input(shape = (series_input_train.shape[1], ), name = 'series_input')
x = Conv1D(filters=32, kernel_size=5, strides=1, padding="causal", activation="relu")(series_input)
x = LSTM(32, return_sequences = True)(x)
x = LSTM(32, return_sequences = True)(x)
x = Dense(1, activation = 'relu')(x)
series_output = Lambda(lambda w: w * 200)(x)
weather_input = Input(shape = (weather_input_train.shape[1], ), name = 'weather_input')
x = Dense(32, activation = 'relu')(weather_input)
x = Dense(32, activation = 'relu')(x)
weather_output = …Run Code Online (Sandbox Code Playgroud) 或者,更具体:ConvLSTM2D和之间的区别是ConvLSTM2DCell什么?
SimpleRNN和SimpleRNNCell之间有什么区别?
GRU和GRUCell的问题相同
Keras手册在这里不是很冗长.
我可以从RTFS(阅读那些优秀的资源)看到这些类是不同基类的后代.名称以结尾的那些Cell是子类Layer.
在我的任务中,我需要对视频序列进行分类.也就是说,我的分类器输入是一系列视频帧,输出是单个标签(单热编码矢量).
我应该用什么课?
我是LSTM的新手,经历了理解Keras LSTM,并对Daniel Moller的漂亮答案产生了一些愚蠢的怀疑.
以下是我的一些疑问:
在Achieving one to many 编写的部分下指定了两种方法 ,我们可以使用stateful=True 这些方法循环地获取一步的输出并将其作为下一步的输入(需要output_features == input_features).
在该One to many with repeat vector图中,重复矢量在所有时间步长中One to many with stateful=True作为输入馈送,而在输出中在下一个时间步骤中作为输入馈送.那么,我们不是通过使用stateful=True?来改变图层的工作方式吗?
在构建RNN时,应遵循以上哪两种方法(使用重复向量或将前一时间步输出作为下一个输入)?
在该One to many with stateful=True部分下,为了改变one to many预测手动循环代码中的行为,我们将如何知道steps_to_predict变量,因为我们事先并不知道输出序列长度.
我也不明白整个模型使用last_step output生成方式的方式next_step ouput.它使我对model.predict()功能的工作感到困惑.我的意思是,不是model.predict()同时预测整个输出序列而不是循环通过no. of output sequences(我仍然不知道它的值)生成并做model.predict()预测给定迭代中的特定时间步输出?
我无法理解整个Many to many案例.任何其他链接都会有所帮助.
我知道我们model.reset_states()用来确保新批次独立于前一批次.但是,我们是否手动创建批次序列,以便一个批次跟随另一个批次,或者Keras在stateful=True …
lstm ×10
keras ×7
python ×6
tensorflow ×4
gpu ×2
time-series ×2
convolution ×1
pytorch ×1
rnn ×1