当前位置: 首页 > 知识库问答 >
问题:

Keras Conv2D的尺寸问题,然后是LSTM

楚宏胜
2023-03-14

我试图在Windows10机器上用Python 3.5.2 | Anaconda4.2.0(64位)实现图像序列预测。我有keras和tensorflow的最新版本。

每个图像都是160x128。我的培训集是1008个图像,大小为1008x160x128x1。我想做一个简单的网络,有一个卷积层和一个LSTM层,现在,每个图像被卷积以提取特征,然后输入LSTM以了解时间依赖性。输出应为k(在k=1以下的情况下)预测图像,尺寸为160x128。下面是代码以及model.summary()。

我的卷积层的输出是4维的(无、79、63、32)。因此,我对输出进行了重塑,使其为(无,32,79*63),并且是LSTM层的正确维数(尽管我认为这是在幕后处理的…)。然后,模型编译时不会出现错误(如果我没有进行重塑,则会抛出维度错误)。

因为我的训练数据的每个元素每个样本只有一个时间点,所以我不使用卷积层上的时间分布(经过大量研究,似乎这就是html" target="_blank">解决方案)。然而,我相信对于输出层,所有的样本都聚集在一起,所以有多少样本就有多少时间点,并且要使用时间分布。如果执行此操作,则会出现以下错误:

Traceback(最近一次调用最后一次):File"C:\seqn_pred\read_images_dataset.py",第104行,model.fit(train_x,train_y,纪元=10,batch_size=1,详细=1)File"c:\user\l\anaconda3\lib\site-包\keras\Engine\training.py,第950行,适合batch_size=batch_size)File"c:\user\l\anaconda3\lib\site-包\keras\Engine\training.py",第787行,_standardize_user_dataexception_prefix='Target')File"c:\user\l\anaconda3\lib\site-包\keras\Engine\training_utils.py",第137行,standardize_input_datastr(data_shape))ValueError:检查目标时出错:预期time_distributed_62具有形状(32,1),但得到了具有形状(128,160)的数组

我搜索了stackoverflow上的所有相关帖子,并尝试了所有相关的“解决方案”,但都没有成功。当我尝试做units=160*128时,形状(32160*128)与(128160)之间又出现了一个问题。此外,我还尝试将目标数据重塑为1008x(160*128)x1(因为TimeDistributed需要3-d数据以及展平每个目标),以获得另一个错误

ValueError:检查目标时出错:预期时间\u分配\u 64具有形状(32,20480),但获得具有形状(20480,1)的数组

我还尝试在没有时间分布的情况下运行最后一层,但仍然收到与目标形状相关的错误。

ValueError:检查目标时出错:预期dense_1有形状(32,1),但得到的数组有形状(160,128)

主要问题是卷积层和LSTM层之间以及最终致密层的形状/尺寸。任何帮助都将不胜感激。

train_x, test_x = [D2[i] for i in rand_indx], [D2[i] for i in range(N-1) if i not in rand_indx]
train_y, test_y = [D2[i+1] for i in rand_indx], [D2[i+1] for i in range(N-1) if i not in rand_indx]

train_x = np.array(train_x)
train_x = train_x.reshape(len(train_x), n, m,1)
train_y = np.array(train_y)
train_y = train_y.reshape(train_y.shape[0], train_y.shape[1]*train_y.shape[2], 1)

model = Sequential()
#model.add(TimeDistributed(Conv2D(filters = 32, kernel_size = (3,3), strides = (1,1), activation = 'relu', padding = 'valid', input_shape = (1, n, m, 1))))
#model.add(TimeDistributed(MaxPooling2D(pool_size = (3,3))))
#model.add(TimeDistributed(Dropout(0.30)))
#model.add(TimeDistributed(Flatten()))
model.add(Conv2D(filters = 32, kernel_size = (3,3), strides = (1,1), activation = 'relu', padding = 'valid', input_shape = (n, m, 1)))
model.add(MaxPooling2D(pool_size = (2,2)))
model.add(Dropout(0.30))
model.add(Reshape((32,-1)))
model.add(LSTM(units = 20, activation = 'relu', return_sequences = True))
model.add(Dropout(0.1))
model.add(TimeDistributed(Dense(1, activation = 'relu')))
optim = krs.optimizers.Adam(lr = 0.375)
model.compile(loss = 'mse', optimizer = optim)
model.fit(train_x, train_y, epochs = 10, batch_size = 1, verbose = 1)

model.summary()

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_73 (Conv2D)           (None, 158, 126, 32)      320       
_________________________________________________________________
max_pooling2d_53 (MaxPooling (None, 79, 63, 32)        0         
_________________________________________________________________
dropout_93 (Dropout)         (None, 79, 63, 32)        0         
_________________________________________________________________
reshape_13 (Reshape)         (None, 32, 4977)          0         
_________________________________________________________________
lstm_57 (LSTM)               (None, 32, 20)            399840    
_________________________________________________________________
dropout_94 (Dropout)         (None, 32, 20)            0         
_________________________________________________________________
dense_44 (Dense)             (None, 32, 1)             21        
=================================================================
Total params: 400,181
Trainable params: 400,181
Non-trainable params: 0
_________________________________________________________________

共有1个答案

明松
2023-03-14

我对你在这里想要达到的目标有点困惑。这是我的2美分。

输入:(1008160128,1)

输出:(1008160*128)

如果只有一个输出目标,则不应在LSTM层中使用return\u sequences=True,也不需要TimeDistributed层。最后一位需要更改如下。

model.add(Reshape((32,-1)))
model.add(LSTM(units = 20, activation = 'relu'))
model.add(Dropout(0.1))
model.add(Dense(160*128, activation = 'relu'))

如果进行上述更改,则可以使用具有上述输入和输出形状的数据来训练模型。

但是,有一个危险信号,你可能需要考虑一下。

  • 重塑卷积输出的方式。目的是什么?您是否希望每个通道都是模型的独立输入,如果是,您首先需要交换输入的轴,以便通道维度保持不变。因为你现在这样做的方式,(在我看来)向LSTM层发送一些非常随机的东西。这是我提议的改变
model.add(Permute([3,1,2]))
model.add(Dropout(0.30))
model.add(Reshape((32,-1)))
 类似资料:
  • 这是我的build.gradle文件

  • 在我的android项目中实现谷歌广告后,我面临着应用程序大小的大幅增加,对我来说,这是由com.google.android.gms.internal.ads.中的许多类引起的。有什么方法可以用更低的内存来实现广告吗?

  • 升级为金丝雀工作室。我以前的Telegram Messenger项目给出了以下错误。 我该怎么办?我已经看到了链接,但不明白该怎么做。我现在有3个构建变体,发布,调试和自由开放源码。

  • 我有这个错误:值错误:检查输入时的错误:预期dense_1_input有形状(6,),但得到了形状(1,)数组,但我的keras模型的输入层model.add(密集(单位=5,kernel_initializer='统一',激活='relu',input_dim=6))所以(6,)维度和输入是输入=np.array([HeadX, HeadY, TailX, TailY, AppleX, Appl

  • 主要内容:jQuery 尺寸方法,jQuery 尺寸,jQuery width() 和 height() 方法,实例,jQuery innerWidth() 和 innerHeight() 方法,实例,jQuery outerWidth() 和 outerHeight() 方法,实例通过 jQuery,很容易处理元素和浏览器窗口的尺寸。 jQuery 尺寸方法 jQuery 提供多个处理尺寸的重要方法: width() height() innerWidth() innerHeight() ou

  • 我参考了更多的文件,也遇到了这篇和许多似乎是我的问题的帖子。但我想在这里得到更具体的建议或答案。 问题是,我已经为5英寸手机(比如nexus 4)开发了主屏幕,所以它看起来很好。当我在4英寸手机(比如nexus s)上运行相同的应用程序时,主屏幕看起来不像5年前那样“手机。这太奇怪了,有些按钮和视图没有安装。我现在该怎么办?我还尝试创建一个单独的布局文件夹,如layout-320dp和layout