在 Keras 中使用 GRU 的 RNN

Posted

技术标签:

【中文标题】在 Keras 中使用 GRU 的 RNN【英文标题】:RNN with GRU in Keras 【发布时间】:2019-03-31 02:23:42 【问题描述】:

我想在 python 中使用 Keras 实现带有 GRU 的递归神经网络。我在运行代码时遇到问题,我越来越多地更改变量,但它不起作用。你有解决办法吗?

inputs = 42          #number of columns input  
num_hidden =50      #number of neurons in the layer
outputs = 1           #number of columns output  
num_epochs = 50
batch_size = 1000
learning_rate = 0.05
#train       (125973, 42)  125973 Rows and 42 Features
#Labels  (125973,1) is True Results
model = tf.contrib.keras.models.Sequential()
fv=tf.contrib.keras.layers.GRU
model.add(fv(units=42, activation='tanh', input_shape= (1000,42),return_sequences=True))  #i want to send Batches to train


#model.add(tf.keras.layers.Dropout(0.15))  # Dropout overfitting

#model.add(fv((1,42),activation='tanh', return_sequences=True))
#model.add(Dropout(0.2))  # Dropout overfitting

model.add(fv(42, activation='tanh'))
model.add(tf.keras.layers.Dropout(0.15))  # Dropout overfitting

model.add(tf.keras.layers.Dense(1000,activation='softsign'))
#model.add(tf.keras.layers.Activation("softsign"))


start = time.time()
# sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
# model.compile(loss="mse", optimizer=sgd)
model.compile(loss="mse", optimizer="Adam") 
inp = np.array(train)
oup = np.array(labels)
X_tr = inp[:batch_size].reshape(-1, batch_size, inputs)
model.fit(X_tr,labels,epochs=20, batch_size=batch_size)

但是我收到以下错误:

ValueError: Error when checking target: expected dense to have shape (1000,) but got array with shape (1,)

【问题讨论】:

你能告诉我如何改变它吗? 如果以下答案之一解决了您的问题,请通过单击答案旁边的复选标记将其标记为“已回答”接受 - 请参阅What should I do when someone answers my question? 【参考方案1】:

在这里,您提到输入向量形状为 1000。

model.add(fv(units=42, activation='tanh', input_shape= (1000,42),return_sequences=True)) #i want to send Batches to train

但是,您的训练数据 (X_tr) 的形状是一维的 检查您的 X_tr 变量并且输入层具有相同的维度。

【讨论】:

X_tr 为 (1, 1000, 42) 我真的不知道我很困惑【参考方案2】:

如果您仔细阅读错误,您会发现您提供的标签形状((None, 1))与模型输出的形状((None, 1))之间存在形状不匹配:

ValueError: Error when checking target:  <--- This means the output shapes
expected dense to have shape (1000,)     <--- output shape of model  
but got array with shape (1,)            <--- the shape of labels you give when training

因此,您需要使它们保持一致。您只需将最后一层中的单元数更改为 1,因为每个输入样本有一个输出:

model.add(tf.keras.layers.Dense(1, activation='softsign')) # 1 unit in the output

【讨论】:

我改变了它,但是错误acure ValueError:输入数组应该与目标数组具有相同数量的样本。找到 1 个输入样本和 125973 个目标样本。 @Mahdi.m 确保输入数据(X_tr)的形状为(num_samples, num_timesteps, num_features),标签数组(labels)的形状为(num_samples,)(num_samples, 1) X_tr.shape,label.shape ((1000, 1, 42), (1000, 1)) ValueError: 检查输入时出错:预期 gru_4_input 具有形状 (1000, 42) 但得到了数组形状为 (1, 42) @Mahdi.m 将 GRU 层的输入形状更改为 (1, 42) 它的工作!!!谢谢我有一个问题我如何发送批次来训练它?我应该使用循环吗?你能告诉我吗?

以上是关于在 Keras 中使用 GRU 的 RNN的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中使用 RNN (Keras) 进行时间序列预测

keras中双向LSTM流程的验证

Keras之RNN和LSTM

word2vec 的 RNN 模型 (GRU) 到回归不学习

如何在 Keras 中重置状态变量?

RNN从入门到实战GRU入门到实战——使用GRU预测股票。