Keras RNN输入维度问题

Keras RNN输入维度问题,keras,Keras,我试图使用keras创建一个简单的RNN,但我遇到了以下错误: ValueError:检查输入时出错:预期简单输入为3维,但得到了形状为(10,5)的数组。 我发现这是一个常见的问题,并发现了许多类似的问题,但在我的案例中,我仍然无法解决它 代码: 将numpy导入为np 导入glob 从keras.models导入顺序 从keras.layers导入简单、密集、重塑 从keras.preprocessing导入序列 CHARMAP=“abcdefghijklmnopqrstuvxyzabefg

我试图使用keras创建一个简单的RNN,但我遇到了以下错误:

ValueError:检查输入时出错:预期简单输入为3维,但得到了形状为(10,5)的数组。

我发现这是一个常见的问题,并发现了许多类似的问题,但在我的案例中,我仍然无法解决它

代码:

将numpy导入为np
导入glob
从keras.models导入顺序
从keras.layers导入简单、密集、重塑
从keras.preprocessing导入序列
CHARMAP=“abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyz1234567890-=!@$%^&*()”、“~[]\{}}}124;”:\”、./?”
SEQLEN=5
批量大小=10
ALPHASIZE=len(字符映射)
内部大小=512
NLAYERS=3
学习率=0.001#固定学习率
辍学率=0.8#一些辍学者
FILES=“shakespeare/*.txt”
##数据相关的东西
def char_至_值(char):
idx=CHARMAP.find(char)
如果idx>=0:
返回idx
其他:
返回0
def值到字符(值):
返回CHARMAP[值]
#迭代每个文件
def get_文件_数据(模式、索引):
路径=全局。全局(模式)
长度=长度(路径)
如果索引<长度:
数据=[]
打开(路径[索引],“r”)作为文件:
对于文件中的行:
行_值=[行中l的字符_到_值(l)]
数据=数据+列表(行值)
返回数据
其他:
一无所获
#获取文件中的批处理数据
def生成行数据(文件数据、序号、批次索引、批次计数):
长度=长度(文件\数据)
开始=批次索引*批次计数
结束=开始+顺序
x=[]
y=[]
而end+110:
打破
答复:

回溯(最近一次呼叫最后一次):
文件“07_rnn.py”,第79行,在
model.fit(x,y,epochs=3,batch\u size=BATCHSIZE)
文件“/home/dmabelin/.local/lib/python3.5/site-packages/keras/models.py”,第965行,适合
验证步骤=验证步骤)
文件“/home/dmabelin/.local/lib/python3.5/site-packages/keras/engine/training.py”,第1593行,适合
批次大小=批次大小)
文件“/home/dmabelin/.local/lib/python3.5/site packages/keras/engine/training.py”,第1426行,在用户数据中
异常(前缀为“输入”)
文件“/home/dmabelin/.local/lib/python3.5/site packages/keras/engine/training.py”,第110行,输入数据
“带形状”+str(数据形状))
ValueError:检查输入时出错:简单输入应为3维,但得到了形状为(10,5)的数组
批次数据:

[[0 46 44 41 35]
[46 44 41 35 38]
[44 41 35 38 47]
[41 35 38 47 45]
[35 38 47 45  0]
[38 47 45  0 27]
[47 45  0 27 40]
[45  0 27 40 30]
[ 0 27 40 30  0]
[27 40 30  0 29]]

github链接:

传递到SimpleRN层的
ALPHASIZE
是一条线索:字母表的大小是预期数据的维度之一

对于一个包含三个字符的一行的批次,模型不需要像
[[1 4 2]]
这样的数组,而是需要一个“一个热”编码行,每个位置的数组大小为
ALPHASIZE
,除了匹配索引的
1
[[0 1 0 0][0 0 0 0 1][0 1 0 0 0]]

keras.utils
中有各种帮助方法,可以使您的数据准备更容易、更快。但要简单地修复代码,您可能可以替换:

while end+1 <= length and len(x) < batch_count:
    x_line = file_data[start:end]
    y_line = file_data[start+1:end+1]

而end+1谢谢。我使用了从keras.utils.np_utils import到_category的

line = np.zeros((end - start, ALPHASIZE))
while end <= length and len(x) < batch_count:    
    line = np.zeros((end - start, ALPHASIZE))
x_line = line[:-1]
y_line = line[1:]