如何在 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)
我正在研究 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)