【问题标题】:expected time_distributed_38_input to have 5 dimensions, but got array with shape (13974, 100, 6, 5)预期 time_distributed_38_input 有 5 个维度,但得到了形状为 (13974, 100, 6, 5) 的数组
【发布时间】:2020-01-30 02:19:07
【问题描述】:

火车尺寸:13974 测试大小:3494 火车形状 : (13974, 101, 6, 5) 测试形状:(3494、101、6、5) 训练输入形状:(13974, 100, 6, 5) 训练输出形状:(13974, 1, 6, 5) 测试输入形状:(3494, 100, 6, 5) 测试输出形状:(3494, 1, 6, 5)

model = Sequential()
model.add(TimeDistributed(Conv2D(32, (3, 3), padding='same'), 
input_shape=(100, 6, 5,1)))
model.add(TimeDistributed(Activation('relu')))
model.add(TimeDistributed(Conv2D(32, (3, 3))))
model.add(TimeDistributed(Activation('relu')))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Dropout(0.25)))

model.add(TimeDistributed(Flatten()))
model.add(TimeDistributed(Dense(512)))

model.add(TimeDistributed(Dense(35, name="first_dense_flow" )))

model.add(LSTM(20, return_sequences=True, name="lstm_layer_flow"));    
model.add(TimeDistributed(Dense(101), name=" time_distr_dense_one_ flow "))  
model.add(GlobalAveragePooling1D(name="global_avg_flow"))
model.compile(loss='mae', optimizer='adam', metrics=['accuracy'])
model.fit(train_input,train_output,epochs=50,batch_size=60)

我收到 ValueError:检查输入时出错:预期 time_distributed_38_input 有 5 个维度,但得到了形状为 (13974, 100, 6, 5) 的数组

我需要从 (100,6,5) 预测 (1,6,5),其中 100 是时间戳。

请更正模型中需要的任何更改

【问题讨论】:

    标签: tensorflow conv-neural-network lstm keras-layer


    【解决方案1】:

    见改写的sn-p:

    model.add(Conv2D(32, (3, 3), padding='same'), input_shape=(100, 6, 5))
    model.add(Activation('relu'))
    model.add(Conv2D(32, (3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    
    model.add(TimeDistributed(Dense(512)))
    model.add(TimeDistributed(Dense(35, name="first_dense_flow" )))
    
    model.add(LSTM(20, return_sequences=True, name="lstm_layer_flow"));    
    model.add(TimeDistributed(Dense(101), name=" time_distr_dense_one_ flow "))  
    model.add(GlobalAveragePooling1D(name="global_avg_flow"))
    
    • 1 放入input_shapeinput_shapebatch_shape 没有批次维度 - 所以你会有 batch_shape = (60, 100, 6, 5) (因为 batch_size=60
    • 您的数据形状是(101, 6, 5),但您的input_shape(100, 6, 5) - 这可能并不总是有效;在输入模型之前设置input_shape=(101, 6, 5)或切片数据(例如x[:, :100, :, :]
    • Conv2D 不需要 TimeDistributed,因为您的输入是 3D(减去批量暗淡)
    • ActivationMaxPooling2DDropout 会根据其输入尺寸自动缩放,因此 TimeDistributed 是多余的
    • Flatten 将消除 timesteps-channels 关系,这可能不是一个合理的添加 - 但如果你仍然要使用它,你需要为两个 Dense 之后去掉 TimeDistributed,然后Reshape 喂给LSTM

    【讨论】:

    • 感谢您的回复。我正在为 6 个位置 5 个特征构建时空时间序列模型,因此数据是 6 个位置和 5 个变量(特征)的 13974 个序列 100 个时间戳。模型适合这个吗?
    • @RagulKesavanS 您的模型可以使用它,是的 - 至于它是否属于问题的“标准”配置,我不知道 - 尽管它也超出了这个范围题。我的建议是让你的 Dense 单位与 Conv/LSTM 的相当 - 所以 512101 是一个矫枉过正,应该做例如64, 32(第一个 Dense 可以使用 128)。有关其他提示,请参阅我的回答 here
    • 实现上面的代码片段给了我一个语法错误。请为我提供正确的语法。
    • @RagulKesavanS 已修复 - 如果很难发现,请考虑切换到另一个 IDE(例如 Spyder)
    猜你喜欢
    • 2020-01-13
    • 2020-03-14
    • 1970-01-01
    • 2020-06-09
    • 2017-09-28
    • 2019-05-31
    • 2019-09-04
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多