我正在尝试在CNTK中实现LSTM(使用Python)来对序列进行分类.
输入:
特征是固定长度的数字序列(时间序列)
标签是单热值的向量
网络:
input = input_variable(input_dim)
label = input_variable(num_output_classes)
h = Recurrence(LSTM(lstm_dim)) (input)
final_output = C.sequence.last(h)
z = Dense(num_output_classes) (final_output)
loss = C.cross_entropy_with_softmax(z, label)
Run Code Online (Sandbox Code Playgroud)
输出: 序列与标签匹配的概率
所有尺寸都是固定的,所以我认为我不需要任何动态轴,也没有指定任何尺寸.
然而,CNTK并不开心,我得到:
return cross_entropy_with_softmax(output_vector, target_vector, axis, name)
RuntimeError: Currently if an operand of a elementwise operation has any dynamic axes, those must match the dynamic axes of the other operands
Run Code Online (Sandbox Code Playgroud)
如果(根据一些例子)我用动态轴定义标签
label = input_variable(num_output_classes, dynamic_axes=[C.Axis.default_batch_axis()])
Run Code Online (Sandbox Code Playgroud)
它不再抱怨这一点,并进一步:
tf = np.split(training_features,num_minibatches)
tl = np.split(training_labels, num_minibatches)
for i in range(num_minibatches*num_passes): # multiply by the
features …Run Code Online (Sandbox Code Playgroud) 我正在运行单词RNN的张量流的RNN实现
如何计算RNN的困惑度.
以下是培训中的代码,显示每个时期的培训损失和其他事项:
for e in range(model.epoch_pointer.eval(), args.num_epochs):
sess.run(tf.assign(model.lr, args.learning_rate * (args.decay_rate ** e)))
data_loader.reset_batch_pointer()
state = sess.run(model.initial_state)
speed = 0
if args.init_from is None:
assign_op = model.batch_pointer.assign(0)
sess.run(assign_op)
assign_op = model.epoch_pointer.assign(e)
sess.run(assign_op)
if args.init_from is not None:
data_loader.pointer = model.batch_pointer.eval()
args.init_from = None
for b in range(data_loader.pointer, data_loader.num_batches):
start = time.time()
x, y = data_loader.next_batch()
feed = {model.input_data: x, model.targets: y, model.initial_state: state,
model.batch_time: speed}
summary, train_loss, state, _, _ = sess.run([merged, model.cost, model.final_state,
model.train_op, model.inc_batch_pointer_op], feed)
train_writer.add_summary(summary, …Run Code Online (Sandbox Code Playgroud) 我读到的关于将退出应用于rnn的所有内容都参考了Zaremba等人的论文.al表示不在经常性连接之间应用辍学.应在LSTM层之前或之后随机丢弃神经元,而不是LSTM间层.好.
在每个人都引用的论文中,似乎在每个时间步长应用一个随机的"丢失掩码",而不是生成一个随机的"丢失掩码"并重新使用它,将它应用于丢弃的给定层中的所有时间步长.然后在下一批产生一个新的"辍学掩码".
此外,可能更重要的是,tensorflow是如何做到的?我已经检查了tensorflow api,并试图寻找详细的解释,但还没有找到一个.
是否有规范的方法来维持Tensorflow服务的有状态LSTM等?
直接使用Tensorflow API这很简单 - 但我不确定在将模型导出到Serving之后如何最好地在调用之间实现持久的LSTM状态.
有什么例子可以实现上述目标吗?回购中的样品非常基本.
我想知道如何在Keras中实现具有批量标准化(BN)的biLSTM.我知道BN层应该在线性和非线性之间,即激活.使用CNN或Dense图层很容易实现.但是,如何用biLSTM做到这一点?
提前致谢.
我有一些来自多个用户(nUsers)的数据集.每个用户随机抽样(每个用户的非常数nSamples).每个样本都有许多功能(nFeatures).例如:
nUsers = 3 ---> 3个用户
nSamples = [32,52,21] --->第一个用户被采样32次第二个用户被采样52次等.
nFeatures = 10 --->每个样本的特征数量恒定.
我希望LSTM基于当前特征和同一用户的先前预测产生当前预测.我可以使用LSTM层在Keras中做到这一点吗?我有两个问题:1.每个用户的数据都有不同的时间序列.我该怎么办呢?2.如何处理将先前的预测添加到当前时间特征空间以进行当前预测?
谢谢你的帮助!
的形状p_input在此LSTM自动编码为"test.py"是(128,8,1); 意思是128组8位数.我试图使用4组25,000个时间步长(基本上0秒到25,000秒)使这个模型适应基于时间序列的数据.我尝试将此数据集输入到p_input形状(4,25000,1)中,并且没有发生错误.但是当我运行脚本时,而不是让iter 1: 0.01727, iter 2: 0.00983, ...我没有得到脚本的任何打印反馈,所以我假设有一些东西正在举行脚本.我还尝试将未更改batch_num为4和step_num25,000直接更改为未编辑的"test.py"文件,并且没有发生打印反馈的相同结果.
我的想法是,在"test.py"中,p_inputs计算tf.split和tf.squeeze操作的时间太长.另一个想法是我可能需要增加隐藏的LSTM单元hidden_num的数量和/或增加epochs(iteration)的数量.此外,它可能batch_num必须大于step_num.我试图与"test.py"同step_num = 4和batch_num = 25000和脚本印反馈正常运行.
让我知道你对阻止脚本运行的问题的看法.
我已经将一系列图像读入一个具有形状的numpy数组,(7338, 225, 1024, 3)其中7338是样本大小,225是时间步长,1024 (32x32)是3通道(RGB)中的平坦图像像素.
我有一个带LSTM层的顺序模型:
model = Sequential()
model.add(LSTM(128, input_shape=(225, 1024, 3))
Run Code Online (Sandbox Code Playgroud)
但这会导致错误:
Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=4
Run Code Online (Sandbox Code Playgroud)
该文件提到,对于LSTM层输入张量应该是3D tensor with shape (batch_size, timesteps, input_dim),但对我来说我input_dim是2D的.
在Keras中将3通道图像输入LSTM层的建议方法是什么?
我正在penn treebank上实施语言模型培训.
我为每个时间步增加了损失然后计算困惑.
即使经过一段时间的训练,这也让我感到非常困难,数千亿.
损失本身会减少,但最多只能减少到20左右.(我需要一位数的损失以获得合理的困惑).
这让我想知道我的困惑计算是否被误导了.
它应该基于每个时间步的损失,然后平均而不是将它们全部添加?
我的batch_size是20,num_steps是35.
def perplexity(loss):
perplexity = np.exp(loss)
return perplexity
...
loss = 0
x = nn.Variable((batch_size, num_steps))
t = nn.Variable((batch_size, num_steps))
e_list = [PF.embed(x_elm, num_words, state_size, name="embed") for x_elm in F.split(x, axis=1)]
t_list = F.split(t, axis=1)
for i, (e_t, t_t) in enumerate(zip(e_list, t_list)):
h1 = l1(F.dropout(e_t,0.5))
h2 = l2(F.dropout(h1,0.5))
y = PF.affine(F.dropout(h2,0.5), num_words, name="pred")
t_t = F.reshape(t_t,[batch_size,1])
loss += F.mean(F.softmax_cross_entropy(y, t_t))
for epoch in range(max_epoch):
....
for i in range(iter_per_epoch):
x.d, t.d = get_words(train_data, …Run Code Online (Sandbox Code Playgroud) 在我原来的环境中
X1 = (1200,40,1)
y1 = (1200,10)
Run Code Online (Sandbox Code Playgroud)
然后,我可以完美地使用我的代码:
model = Sequential()
model.add(LSTM(12, input_shape=(40, 1), return_sequences=True))
model.add(LSTM(12, return_sequences=True))
model.add(LSTM(6, return_sequences=False))
model.add((Dense(10)))
Run Code Online (Sandbox Code Playgroud)
现在,我进一步获得了另一个与X1和相同大小的时间序列数据y1。即
X2 = (1200,40,1)
y2 = (1200,10)
Run Code Online (Sandbox Code Playgroud)
现在,我叠X1,X2并且y1,y2作为3D阵列:
X_stack = (1200,40,2)
y_stack = (1200,10,2)
Run Code Online (Sandbox Code Playgroud)
然后,我尝试修改我的keras代码,例如:
model = Sequential()
model.add(LSTM(12, input_shape=(40, 2), return_sequences=True))
model.add(LSTM(12, return_sequences=True))
model.add(LSTM(6, return_sequences=False))
model.add((Dense((10,2))))
Run Code Online (Sandbox Code Playgroud)
我希望我的代码直接与3D数组一起使用X_stack,y_stack而不希望将其重塑为2D数组。您能帮我修改设置吗?谢谢。
lstm ×10
python ×7
keras ×4
tensorflow ×4
autoencoder ×1
cntk ×1
data-science ×1
dropout ×1
keras-layer ×1
python-3.x ×1
rnn ×1
time-series ×1