【问题标题】:How to process a large image in Keras?如何在 Keras 中处理大图像?
【发布时间】:2017-09-21 21:54:36
【问题描述】:

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

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

我尝试了几种在 Keras 上构建模型的方法,例如 CNN、双向 LSTM 或简单的神经网络(扁平和密集)。但它们都不起作用。

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

【问题讨论】:

  • 实际输入是(4214,1)的形状,但我连接了一些固定数据以将(4214,1)转换为(4214, 22312)。等效地,我们可以将输入形状视为(4214, 22312)
  • 2 万亿参数???哇。最好的机会是使用 GlobalMaxPooling 的完全卷积模型,或者可能是有状态的 LSTM 模型。
  • 问题:4214项不是独立的吗?我认为(根据您之前的问题)它们是单独的样本。
  • 另外,所有 22311 项在所有 4214 行中都完全相同的事实让我想了很多关于这是否是最好的方法....
  • 一个数据样本由 4214 个特征描述,因此我们有 4214 个输入条目。假设它们是独立的。是的,在我的最后一个问题中,其他 22311 项与 4214 行相同,所以除了使用 CNN 之外,您认为还有哪些其他方法可行?

标签: machine-learning tensorflow neural-network keras recurrent-neural-network


【解决方案1】:

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

而且由于您想要输出 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)

【讨论】:

  • 感谢您的建议。我试过你的模型,但我不知道我可以为cells 选择什么合适的值。我收到错误ValueError: Cannot create a tensor proto whose content is larger than 2GB. 错误发生在out = TimeDistributed(LSTM(cells,return_sequences=True))(out)。目前我设置了单元格22312,除了最后一个,即22311
  • 我创建了一个github repo。如果您可以查看我的代码以获取详细信息,那就太好了。
  • 哦,你用 nsamples 作为单元格的数量。这将再次导致一个非常巨大的权重矩阵。数字不准确,您可以测试表现最佳的数字。但是想想 50、100 的事情。如果你达到 10000,你可能远远超出了真正需要的东西。
  • 好的.. 所以下一个错误发生在out = Permute((2,1))(out),即ValueError: Input 0 is incompatible with layer permute_1: expected ndim=3, found ndim=4
  • 好的,它运行...但是ResourceExhaustedError: OOM when allocating tensor with shape[94022768,50](我选择cells=50)。基本上,现在我们有了81,000 参数。我是否要将cells 调整为更小的值?喜欢10?还是没用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多