从CuDNNLSTM到密集层的问题

时间:2018-09-11 04:53:59

标签: python tensorflow keras

我遇到了一个问题,我花了太长时间。我已经阅读了很多文档并观看了许多教程,却不明白为什么当我从示例中修改我的网络时,人们总是显示并输入我自己的数据!

我有一个形状正确的数据集:

train_X.shape = (312,5000,7)
train_Y.shape = (312,5000,1)

我按正确的顺序进行处理(312个样本,5000个时间步长,7个数据通道)。然后,我为这312个样本中的每个样本创建了一个标签集,如果我想要或不想要,它只会显示0或1。这非常类似于Coursera所做的激活字工作,但我根本不尝试使用语音或音频,这是传感器数据(时间驱动的传感器数据)。

我有2个问题,我想如果有人可以回答第一个问题,我可能会想出来,或者如果您能明白为什么我在这里失败,那也将不胜感激。

我决定建立一个相当深的模型(我的浅表的性能较差),并从原始模型开始重新设计。我的问题是它根本不再喜欢尺寸。

model = Sequential()
model.add(CuDNNLSTM(LSTM_units,
                  input_shape = (x_train.shape[1:]),
                  return_sequences=True))
model.add(Dropout(DR))

model.add(CuDNNLSTM(LSTM_units,
                   return_sequences=True))
model.add(Dropout(DR))

model.add(CuDNNLSTM(LSTM_units))
model.add(Dropout(DR))    

model.add(Dense(32, activation='relu'))
model.add(Dropout(DR))

model.add(Dense(2, activation='softmax'))

我的编译工作很好,很高兴,并且给了我一个摘要,详细说明了我的模型将在LSTM结束时从(None,5000,18)->(None,128)慢慢变到(无,32)->(无,2),因为我有2个班级(0或1)。

在尝试适应模型时,我被告知:

Error when checking target: expected dense_14 to have 2 dimensions, but got array with shape (312, 5000, 1)

我试图在将矩阵传递到密集层时重塑矩阵,但这似乎根本不起作用...

所以我的问题是这样的: 1)在建立模型方面,我在这里做错了什么?

2)有没有一种方法可以...在每步发生时打印出张量大小,而不是在model.summary命令中?

谢谢。

1 个答案:

答案 0 :(得分:0)

我在这里找到了解决方法

Incompatible dense layer error in keras

我认为我不能将我的问题标记为重复的问题...本质上,我遇到的问题是我要求网络给我输出(batch_size,2),而实际上我想得到输入中每个数据点的答案!

我将几个教程中的不良做法全部合并为一个,给了我很多问题。希望这对遇到同样问题的人有所帮助。我的更新代码也发布在下面。

def create_model(x_train, GRU_units,DR):
model = Sequential()
print("Adding first layer...")
model.add(CuDNNLSTM(GRU_units,
                  input_shape = (x_train.shape[1:]),
                  return_sequences=True))
model.add(Dropout(DR))
print(model.output_shape)

print("Adding second layer...")
model.add(CuDNNLSTM(GRU_units,
                   return_sequences=True))
model.add(Dropout(DR))
print(model.output_shape)

print("Adding third layer...")
model.add(CuDNNLSTM(GRU_units, 
                    return_sequences=True))
model.add(Dropout(DR))
print(model.output_shape)    

print("Adding fourth layer (Dense 32)...")
model.add(TimeDistributed(Dense(32, activation='relu')))
model.add(Dropout(DR))
print(model.output_shape)

print("Adding output layer...")
model.add(TimeDistributed(Dense(1, activation='sigmoid')))
print(model.output_shape)

return model