我正在尝试使用本文https://arxiv.org/abs/1712.01815中描述的方法来使算法学习新游戏。
只有一个问题不能直接适合这种方法。我尝试学习的游戏没有固定的棋盘尺寸。因此,当前输入张量的尺寸为m*n*11,其中m和n是游戏板的尺寸,并且每次玩游戏时都可以变化。因此,首先,我需要一个能够利用这种变化的输入大小的神经网络。
输出的大小也是电路板大小的函数,因为它具有一个向量,其中包含电路板上每个可能移动的条目,因此,如果电路板大小增加,输出向量将更大。
我已经读过递归和递归神经网络,但是它们似乎都与NLP有关,我不确定如何将其转化为我的问题。
任何能够处理我的案例的关于NN体系结构的想法都将受到欢迎。
我正在使用Keras构建LSTM,并通过使用外部成本函数进行梯度下降来对其进行调整。因此权重将更新为:
weights := weights + alpha* gradient(cost)
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用获得权重keras.getweights(),但是如何进行梯度下降并更新所有权重并相应地更新权重。我尝试使用initializer,但仍然没有弄清楚。我只找到了一些与tensorflow相关的代码,但我不知道如何将其转换为Keras。
任何帮助,提示或建议,将不胜感激!
我能够使用keras成功训练我的有状态LSTM.我的批量大小为60,我在网络中发送的每个输入都可以被batch_size整除.以下是我的代码段:
model = Sequential()
model.add(LSTM(80,input_shape = trainx.shape[1:],batch_input_shape=(60,
trainx.shape[1], trainx.shape[2]),stateful=True,return_sequences=True))
model.add(Dropout(0.15))
model.add(LSTM(40,return_sequences=False))
model.add(Dense(40))
model.add(Dropout(0.3))
model.add(Dense(output_dim=1))
model.add(Activation("linear"))
keras.optimizers.RMSprop(lr=0.005, rho=0.9, epsilon=1e-08, decay=0.0)
model.compile(loss="mse", optimizer="rmsprop")
Run Code Online (Sandbox Code Playgroud)
我的训练线成功运行:
model.fit(trainx[:3000,:],trainy[:3000],validation_split=0.1,shuffle=False,nb_epoch=9,batch_size=60)
Run Code Online (Sandbox Code Playgroud)
现在我尝试预测测试集再次被60整除,但是我得到了错误:
ValueError:在有状态网络中,您应该只传递带有多个样本的输入,这些样本可以除以批量大小.发现:240个样本.批量:32.
谁能告诉我上面有什么问题?我很困惑,尝试了很多东西,但没有任何帮助.
据我所知,DropoutWrapper使用如下
__init__(
cell,
input_keep_prob=1.0,
output_keep_prob=1.0,
state_keep_prob=1.0,
variational_recurrent=False,
input_size=None,
dtype=None,
seed=None
)
Run Code Online (Sandbox Code Playgroud)
.
cell = tf.nn.rnn_cell.LSTMCell(state_size, state_is_tuple=True)
cell = tf.nn.rnn_cell.DropoutWrapper(cell, output_keep_prob=0.5)
cell = tf.nn.rnn_cell.MultiRNNCell([cell] * num_layers, state_is_tuple=True)
Run Code Online (Sandbox Code Playgroud)
我唯一知道的是它在训练时用于辍学.这是我的三个问题
什么是input_keep_prob,output_keep_prob和state_keep_prob?(我猜他们定义了RNN每个部分的丢失概率,但究竟在哪里?)
在这种背景下,辍学不仅适用于RNN,还适用于培训,还适用于预测过程?如果这是真的,有没有办法决定我是否在预测过程中使用辍学?
任何人都可以解释什么数据时间主要和批次主要意味着什么是它们之间的区别?
需要说明的是,我指的是文档分类的分层注意网络中描述的类型的"自我关注" 并实现了许多地方,例如:这里.我不是指在编码器 - 解码器模型(即Bahdanau)中使用的seq2seq类型的注意,虽然我的问题可能也适用于那个......我只是不熟悉它.
自我关注基本上只计算RNN隐藏状态的加权平均值(均值汇总的概括,即未加权平均值).当同一批次中存在可变长度序列时,它们通常将零填充到批次中最长序列的长度(如果使用动态RNN).当为每个序列计算注意权重时,最后一步是softmax,因此注意权重总和为1.
然而,在我所看到的每一个注意力实施中,都没有注意掩盖或以其他方式取消零填充对注意力的影响.这对我来说似乎不对,但我担心也许我错过了一些东西,因为没有其他人似乎对此感到困扰.
例如,考虑一个长度为2的序列,零填充到长度为5.最终,这会导致注意权重被计算为类似0填充向量的softmax,例如:
权重= softmax([0.1,0.2,0,0,0])= [0.20,0.23,0.19,0.19,0.19]
并且因为exp(0)= 1,零填充实际上"降低"了注意力量.在softmax操作之后,通过将权重乘以二元掩模,即,可以很容易地修复这个问题
mask = [1,1,0,0,0]
然后将权重重新标准化为总和为1.这将导致:
权重= [0.48,0.52,0,0,0]
当我这样做时,我几乎总能看到性能提升(在我的模型的准确性 - 我正在做文档分类/回归).那么为什么没有人这样做呢?
有一段时间我认为可能重要的是注意权重(即比率)的相对值,因为梯度无论如何都不会通过零填充.但是,为什么我们会使用softmax而不是exp(.),如果归一化无关紧要?(加上,这无法解释性能提升......)
machine-learning deep-learning tensorflow attention-model rnn
我想用np数组初始化RNN的参数。
在以下示例中,我想传递w给的参数rnn。我知道pytorch提供了许多初始化方法,例如Xavier,uniform等,但是是否可以通过传递numpy数组来初始化参数?
import numpy as np
import torch as nn
rng = np.random.RandomState(313)
w = rng.randn(input_size, hidden_size).astype(np.float32)
rnn = nn.RNN(input_size, hidden_size, num_layers)
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个简单的 RNN 来预测整数序列中的下一个整数。所以,我有一个如下的数据集:
Id Sequence
1 1,0,0,2,24,552,21280,103760,70299264,5792853248,587159944704
2 1,1,5,11,35,93,269,747,2115,5933,16717,47003,132291,372157,1047181,2946251,8289731,23323853,65624397,184640891,519507267,1461688413,4112616845,11571284395,32557042499,91602704493,257733967693
4 0,1,101,2,15,102,73,3,40,16,47,103,51,74,116,4,57,41,125,17,12,48,9,104,30,52,141,75,107,117,69,5,148,58,88,42,33,126,152,18,160,13,38,49,55,10,28,105,146,31,158
5 1,4,14,23,42,33,35,34,63,66,87,116,84,101,126,164,128,102,135,143,149,155,203,224,186,204,210,237,261,218,219,286,257,266,361,355,336,302,374,339,371,398,340,409,348,388,494,436,407,406
6 1,1,2,5,4,2,6,13,11,4,10,10,12,6,8,29,16,11,18,20,12,10,22,26,29,12,38,30,28,8,30,61,20,16,24,55,36,18,24,52,40,12,42,50,44,22,46,58,55,29,32,60,52,38,40,78,36,28,58,40,60,30,66,125,48,20,66,80,44,24
9 0,31,59,90,120,151,181,212,243,273,304,334,365,396,424,455,485,516,546,577,608,638,669,699,730,761,789,820,850,881,911,942,973,1003,1034,1064,1095,1126,1155,1186,1216,1247,1277,1308,1339,1369,1400,1430
10 1,1,2,5,13,36,111,347,1134,3832,13126,46281,165283,598401,2202404,8168642,30653724,116082962,442503542,1701654889,6580937039,25603715395,100223117080,394001755683,1556876401398,6178202068457,24608353860698,98421159688268,394901524823138,1589722790850089
12 0,0,0,0,112,40286,5485032,534844548,45066853496,3538771308282,267882021563464,19861835713621616,1453175611052688600,105278656040052332838,7564280930105061931496
Run Code Online (Sandbox Code Playgroud)
到目前为止我的代码是:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import math
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import SimpleRNN
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from keras.preprocessing.sequence import pad_sequences
def stoarray(data = [], sep = ','):
return data.map(lambda x: np.array(x.split(sep), dtype=float))
def create_dataset(dataset, window_size=1):
dataX, dataY = [], [] …Run Code Online (Sandbox Code Playgroud) 我面临以下问题。我有大量文档要使用双向 LSTM 进行编码。每个文档都有不同数量的单词,单词可以被认为是一个时间步长。
在配置双向 LSTM 时,我们需要提供时间序列长度。当我训练模型时,每个批次的这个值都会不同。我应该为timeseries_size我允许的最大文档大小选择一个数字吗?任何大于这个的文件都不会被编码?
示例配置:
Bidirectional(LSTM(128, return_sequences=True), input_shape=(timeseries_size, encoding_size))
Run Code Online (Sandbox Code Playgroud) ...来自 TensorFlow,其中几乎任何形状和所有内容都明确定义,我对 Keras 的循环模型 API 感到困惑。让 Elman 网络在 TF 中工作非常容易,但 Keras 拒绝接受正确的形状......
例如:
x = k.layers.Input(shape=(2,))
y = k.layers.Dense(10)(x)
m = k.models.Model(x, y)
Run Code Online (Sandbox Code Playgroud)
...工作完美,根据model.summary()我得到一个输入层的形状(None, 2),然后是一个输出形状的密集层(None, 10)。有道理,因为 Keras 会自动为批处理添加第一个维度。
但是,以下代码:
x = k.layers.Input(shape=(2,))
y = k.layers.SimpleRNN(10)(x)
m = k.models.Model(x, y)
Run Code Online (Sandbox Code Playgroud)
引发异常ValueError: Input 0 is incompatible with layer simple_rnn_1: expected ndim=3, found ndim=2。
仅当我添加另一个维度时才有效:
x = k.layers.Input(shape=(2,1))
y = k.layers.SimpleRNN(10)(x)
m = k.models.Model(x, y)
Run Code Online (Sandbox Code Playgroud)
...但现在,当然,我的意见不会(None, 2)了。
model.summary():
_________________________________________________________________
Layer (type) Output …Run Code Online (Sandbox Code Playgroud) rnn ×10
keras ×5
python ×4
tensorflow ×4
lstm ×3
bayesian ×1
nlp ×1
numpy ×1
performance ×1
python-3.x ×1
pytorch ×1