如何在 Keras 中处理大图像?

How to process a large image in Keras?

我正在研究 Keras 上的机器学习问题。我的objective是训练一个输入是(4214, 22311)矩阵,输出是(22311,)向量的模型。

这样的二维数据可以被视为图像输入,但大多数图像分类器仅适用于形状为 (200, 200) 的小图像。

我尝试了几种在 Keras 上构建模型的方法,例如 CNN、双向 LSTM 或简单的神经网络(展平和密集)。但其中 none 有效。

我没有完成一个纪元就收到了 killed。所以我想知道什么样的结构可以处理这么大的输入。

它很有可能可以在完全卷积模型中工作,在这种模型中,您必须在任何一种 flatten/dense 之前消除空间维度。但是因为只有相同的数据会有太多的卷积,这似乎不是最好的主意....

并且因为你想要一个包含 22311 个结果的输出,LSTM 方法(考虑到一个不同的变量是第一个)可能是最有用的....

一个 LSTM 模型:

第一次尝试时,您可以尝试使用无状态 LSTM 模型。

但不要像最后一个维度是特征一样工作(20000 个特征将创建许多参数)!!!就像它们是时间步长一样工作。

分步转换特征可能会使模型更难以理解。另一方面,如果你不这样做,你的记忆将永远崩溃。但是,如果一个不同的数据是第一步,那么接下来的所有(和重复的)数据很有可能会获得一些额外的意义。

所以,首先,我们只重塑一个特征:

inp = Input((4214,1))
out = Lambda(yourFunction, output_shape=(4214,22312))(inp)
out = Reshape((4214,22312,1))(out)

现在,让我们尝试一个技巧,让它看起来像是一个序列序列,添加 TimeDistributed 包装器(这允许增加维度):

out = TimeDistributed(LSTM(cells,return_sequences=True))(out)

#you may add more

让我们保留 return_sequences = True,因为您希望模型末尾的步数非常相似。

在某些时候,让我们折叠 4214 维度,将其放在末尾,就好像它是时间步长一样(或者甚至就好像它是特征 - 有风险,但比 23312 特征风险小得多)。在这里,由于它们是独立的,Bidirectional 包装器可能会派上用场:

out = Permute((2,1,3))(out)

1 - 如果您选择 4214 步:

#you can use one or more layers with return_sequences=True before this one
out = TimeDistributed(Bidirectional(LSTM(cells,return_sequences=False)))(out)

2 - 如果您选择 4214 功能:

#remove the last dimension which was 1
out = Reshape((22312,4214))  

#no need to care about they being a sequence, no TimeDistributed, no Bidirectional. 
out = LSTM(cells,return_sequences=True)(out)
    #the return_sequences=True here relates to the 22312 steps   

#but you need to go back to 1 feature per step:
out = Reshape((22312,1))(out)

现在4214维度已经坍塌,现在一切都是(batchSize, 22312, 1)形状的序列。由于我们不再是 4D,而是 3D,我们可以放弃 TimeDistributed 包装器:

out = LSTM(cells,return_sequences=True)(out)

最后,使用 lambda 层丢弃该序列的第一个元素(只是为了匹配您想要的输出):

out = Lambda(lambda x: x[:,1:,:], output_shape=(22311,1))(out)
out = Reshape((22311,))(out)

model = Model(inp,out)