python - TF 2.0 顺序 CNN 转换为 LSTM 进行回归 "Negative dimension size"错误

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

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

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'])

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

但是当我尝试运行它时,出现以下错误

Negative dimension size caused by subtracting 2 from 1 for 'conv1d/conv1d' (op: 'Conv2D') with input shapes: [1,1,1,10], [1,2,10,4].

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

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

最佳答案

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

2D 卷积解决方案

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),将其转换为 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中

关于python - TF 2.0 顺序 CNN 转换为 LSTM 进行回归 "Negative dimension size"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58563955/

相关文章:

python - 无法在损失函数中使用VGG特征的MSE

python - 设置 title 标签的字符串属性清除 BeautifulSoup 中另一个标签的字符串属性

python - 使用系列数据减去 Dataframe

python - 具有不同滤波器尺寸的 tensorflow 卷积

machine-learning - 关于CNN训练的一些简单问题

python - 如何在 anaconda 上安装 tensorflow 2.4>?

python - 为什么 python 中的这个 linux 命令不会打开 xterm 终端?

python - 基于项目和 ID 两列的 SUM

python - Pytorch模型精度测试

python - 使用 get_weights() 应用渐变时出错