我很难概念化Keras中有状态和无状态LSTM之间的区别.我的理解是,在每个批处理结束时,在无状态情况下"重置网络状态",而对于有状态情况,每个批处理都保留网络状态,然后必须在每个时代的结束.
我的问题如下:1.在无状态的情况下,如果状态未在批次之间保留,网络如何学习?2.何时使用LSTM的无状态与有状态模式?
我尝试重现TensorFlow的LSTMCell生成的结果,以确保我知道它的作用.
这是我的TensorFlow代码:
num_units = 3
lstm = tf.nn.rnn_cell.LSTMCell(num_units = num_units)
timesteps = 7
num_input = 4
X = tf.placeholder("float", [None, timesteps, num_input])
x = tf.unstack(X, timesteps, 1)
outputs, states = tf.contrib.rnn.static_rnn(lstm, x, dtype=tf.float32)
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
x_val = np.random.normal(size = (1, 7, num_input))
res = sess.run(outputs, feed_dict = {X:x_val})
for e in res:
print e
Run Code Online (Sandbox Code Playgroud)
这是它的输出:
[[-0.13285545 -0.13569424 -0.23993783]]
[[-0.04818152 0.05927373 0.2558436 ]]
[[-0.13818116 -0.13837864 -0.15348436]]
[[-0.232219 0.08512601 0.05254192]]
[[-0.20371495 -0.14795329 -0.2261929 ]]
[[-0.10371902 -0.0263292 -0.0914975 …Run Code Online (Sandbox Code Playgroud) 我正在使用 GPU 在 Databricks 上运行以下 LSTM 代码
model = Sequential()
model.add(LSTM(64, activation=LeakyReLU(alpha=0.05), batch_input_shape=(1, timesteps, n_features),
stateful=False, return_sequences = True))
model.add(Dropout(0.2))
model.add(LSTM(32))
model.add(Dropout(0.2))
model.add(Dense(n_features))
model.compile(loss='mean_squared_error', optimizer=Adam(learning_rate = 0.001), metrics='acc')
model.fit(generator, epochs=epochs, verbose=0, shuffle=False)
Run Code Online (Sandbox Code Playgroud)
但不断出现以下警告
WARNING:tensorflow:Layer lstm will not use cuDNN kernels since it doesn't meet the criteria. It will use a generic GPU kernel as fallback when running on GPU.
Run Code Online (Sandbox Code Playgroud)
它的训练速度比没有 GPU 时慢得多。我正在使用 DBR 9.0 ML(包括 Apache Spark 3.1.2、GPU、Scala 2.12),我是否需要任何其他库?
我有一个数据集X,其中包含N = 4000个样本,每个样本由d = 2个特征(连续值)组成,跨越t = 10个时间步长.在时间步骤11,我还具有每个样本的相应"标签",它们也是连续值.
目前,我的数据集的形状为X:[4000,20],Y:[4000].
考虑到d特征的10个先前输入,我想使用TensorFlow训练LSTM来预测Y(回归)的值,但是我很难在TensorFlow中实现它.
我目前面临的主要问题是了解TensorFlow如何期望输入格式化.我见过各种各样的例子,如本,但这些例子处理连续时间序列数据的一个大的字符串.我的数据是不同的样本,每个都是独立的时间序列.
当使用Keras LSTM预测时间序列数据时,当我尝试使用批量大小为50训练模型时,我一直在收到错误,然后尝试使用批量大小为1(即批量大小)进行预测只是预测下一个值).
为什么我无法同时训练和匹配多个批次的模型,然后使用该模型预测除了相同批次大小之外的任何其他内容.它似乎没有意义,但后来我很容易就会遗漏一些关于此的东西.
编辑:这是模型. batch_size是50,sl是序列长度,目前设置为20.
model = Sequential()
model.add(LSTM(1, batch_input_shape=(batch_size, 1, sl), stateful=True))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, epochs=epochs, batch_size=batch_size, verbose=2)
Run Code Online (Sandbox Code Playgroud)
这是预测RMSE训练集的线
# make predictions
trainPredict = model.predict(trainX, batch_size=batch_size)
Run Code Online (Sandbox Code Playgroud)
这是对看不见的时间步骤的实际预测
for i in range(test_len):
print('Prediction %s: ' % str(pred_count))
next_pred_res = np.reshape(next_pred, (next_pred.shape[1], 1, next_pred.shape[0]))
# make predictions
forecastPredict = model.predict(next_pred_res, batch_size=1)
forecastPredictInv = scaler.inverse_transform(forecastPredict)
forecasts.append(forecastPredictInv)
next_pred = next_pred[1:]
next_pred = np.concatenate([next_pred, forecastPredict])
pred_count += 1
Run Code Online (Sandbox Code Playgroud)
这个问题与行:
forecastPredict = model.predict(next_pred_res, batch_size=batch_size)
batch_size此处设置为1时的错误是:
ValueError: Cannot feed value of …
我需要在最后实现一个带有CRF层的双向LSTM网络.特别是本文提出的模型,并对其进行训练.
http://www.aclweb.org/anthology/P15-1109
我想用Python实现它.任何人都可以提供一些库或示例代码来说明如何做到这一点.我看了PyBrain,但真的不明白.
我也对其他编程语言的工具包持开放态度.
Tensorflow r0.12的tf.nn.rnn_cell.LSTMCell文档将其描述为init:
tf.nn.rnn_cell.LSTMCell.__call__(inputs, state, scope=None)
Run Code Online (Sandbox Code Playgroud)
其中state如下:
state:如果state_is_tuple为False,则必须是状态Tensor,2-D,batch x state_size.如果state_is_tuple为True,则它必须是状态Tensors的元组,两者都是2-D,列大小为c_state和m_state.
它们是什么c_state以及m_state它们如何适合LSTM?我在文档中的任何地方都找不到对它们的引用.
我正在尝试使用图像而不是字体来训练Tesseract 4.
在文档中,他们只解释了字体的方法,而不是图像.
我知道它是如何工作的,当我使用以前版本的Tesseract但我没有得到如何使用box/tiff文件在Tesseract 4中使用LSTM进行训练.
我查看了tesstrain.sh,它用于生成LSTM训练数据,但找不到任何有用的信息.有任何想法吗?
我想预测每周可预测的某些值(低SNR).我需要预测一年中形成的一年的整个时间序列(52个值 - 图1)
我的第一个想法是使用Keras over TensorFlow开发多对多LSTM模型(图2).我正在使用52输入层(前一年的给定时间序列)和52预测输出层(明年的时间序列)训练模型.train_X的形状是(X_examples,52,1),换言之,要训练的X_examples,每个1个特征的52个时间步长.据我所知,Keras会将52个输入视为同一域的时间序列.train_Y的形状是相同的(y_examples,52,1).我添加了一个TimeDistributed层.我的想法是算法会将值预测为时间序列而不是孤立值(我是否正确?)
Keras的模型代码是:
y = y.reshape(y.shape[0], 52, 1)
X = X.reshape(X.shape[0], 52, 1)
# design network
model = Sequential()
model.add(LSTM(n_neurons, input_shape=(X.shape[1], X.shape[2]), return_sequences=True))
model.add(TimeDistributed(Dense(1)))
model.compile(loss='mean_squared_error', optimizer='adam')
# fit network
model.fit(X, y, epochs=n_epochs, batch_size=n_batch, verbose=2)
Run Code Online (Sandbox Code Playgroud)
问题是算法没有学习这个例子.它预测的值与属性的值非常相似.我是否正确建模了问题?
第二个问题:另一个想法是用1输入和1输出训练算法,但是在测试期间如何在不查看'1输入'的情况下预测整个2015时间序列?测试数据将具有与训练数据不同的形状.
lstm ×10
python ×5
tensorflow ×5
keras ×3
crf ×1
databricks ×1
forward ×1
ocr ×1
prediction ×1
pytorch ×1
regression ×1
tesseract ×1
time-series ×1