【问题标题】:TF 2.0 sequential CNN into LSTM for regression "Negative dimension size" errorTF 2.0 顺序 CNN 到 LSTM 中用于回归“负维度大小”错误
【发布时间】:2019-10-25 18:33:59
【问题描述】:

我正在尝试建立一个模型,根据当前市场状况预测某种商品的价格,我的数据类似于

num_samples = 100
sample_dimension = 10
XXX = np.random.random((num_samples,sample_dimension)).reshape(-1,1,sample_dimension)
YYY = np.random.random(num_samples).reshape(-1,1)

所以我有 100 个 X 数据的有序样本,每个样本包含 10 个变量。我的模型如下所示

model = keras.Sequential()
model.add(tf.keras.layers.Conv1D(4,
                                 kernel_size = (2),
                                 activation='sigmoid',
                                 input_shape=(None, sample_dimension),
                                 batch_input_shape = [1,1,sample_dimension]))

model.add(tf.keras.layers.AveragePooling1D(pool_size=2))
model.add(tf.keras.layers.Reshape((1, sample_dimension)))
model.add(tf.keras.layers.LSTM(100,
                                    stateful = True,
                                    return_sequences=False,
                                    activation='sigmoid'))
model.add(keras.layers.Dense(1))

model.compile(optimizer='adam',
              loss='mean_squared_error',
              metrics=['accuracy'])

所以这是一个一维卷积、一个池化、一个重塑(因此它与 lstm 配合得很好),然后向下转换为预测

但是当我尝试运行它时,我收到以下错误

对于输入形状为 [1,1,1,10], [1,2,10,4] 的“conv1d/conv1d”(操作:“Conv2D”)从 1 中减去 2 导致的负尺寸大小。

我已经为内核大小、池大小和 batch_input_shape 尝试了几个不同的值(必须批处理我的输入,因为我的实际数据分布在几个大文件中,所以我想一次读取一个并踢它训练模型),但似乎没有任何效果。

我做错了什么?我如何跟踪/预测通过此模型的数据的形状?数据/变量应该是什么样的?

【问题讨论】:

  • 如果去掉池化层会发生什么?
  • @Andy 同样的错误。问题发生在 conv1d 层
  • 那么唯一的其他 2 是你的内核大小 - 你确定你的输入都不短于 2 吗?
  • 我的输入数据是100个有序样本,每个样本有10个变量XXX = np.random.random((num_samples,sample_dimension)).reshape(-1,1,sample_dimension)

标签: python conv-neural-network tensorflow2.0 lstm-stateful


【解决方案1】:

我最终浏览了 conv2D 的教程,然后将内容转换为 conv1D(请根据需要进行编辑)

conv2D 解决方案

model = keras.Sequential()
model.add(tf.keras.layers.Conv2D(4,
                                 kernel_size = (**1**,2),
                                 activation = 'sigmoid',
                                 input_shape = (**1**,sample_dimension,1),
                                 batch_input_shape = [None,**1**,sample_dimension,1]))

model.add(tf.keras.layers.AveragePooling2D(pool_size=(1,2)))
#model.add(tf.keras.layers.Reshape((1,sample_dimension)))
model.add(tf.keras.layers.Flatten())
model.add(keras.layers.Dense(1))

然后我通过从每个必要的参数(粗体 1s)中取出一个维度将其转换为 conv1D

model = keras.Sequential()
model.add(tf.keras.layers.Conv1D(4,
                                 kernel_size = 2,
                                 activation = 'sigmoid',
                                 input_shape = (sample_dimension,1),
                                 batch_input_shape = [None,sample_dimension,1]))

model.add(tf.keras.layers.AveragePooling1D(pool_size=2))
#model.add(tf.keras.layers.Reshape((1,sample_dimension)))
model.add(tf.keras.layers.Flatten())
model.add(keras.layers.Dense(1))

我想关键的一点是 tensorflow 不是为处理向量甚至矩阵而设计的,所以最后一个维度必须是张量的维度——在这种情况下,它是一个一维张量(只是一个数字)保存在 sample_dimension 中

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2018-12-04
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 2020-01-20
    相关资源
    最近更新 更多