1

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

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 尝试了几个不同的值(必须批处理我的输入,因为我的实际数据分布在几个大文件中,所以我想一次读取一个并将它踢到训练模型),但似乎没有任何效果。

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

4

1 回答 1

0

我最终浏览了 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))

然后我通过从每个必要的参数(粗体1 s)中取出一个维度将其转换为 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 不是为处理向量甚至矩阵而设计的,所以最后一个维度必须是张量的维度——在这种情况下,它是一个 1D 张量(只是一个数字)被保存在一个样本维度

于 2019-10-26T21:01:41.163 回答