【问题标题】:How to determine the shape of my input layer?如何确定我的输入层的形状?
【发布时间】:2021-11-01 02:54:08
【问题描述】:

我是机器学习新手,目前正在尝试使用 Tensorflow 和 Keras。

我有一个时间序列窗口数据集,窗口大小为 128,批处理 32 和 4 个特征(如果重要)。

这是 PrefetchDataset 格式,当我尝试使用 .element_spec 检查形状时,我得到:(TensorSpec(shape=(None, None, 4, 1), dtype=tf.float64, name=None), TensorSpec(shape=(None, 4, 1), dtype=tf.float64, name=None))

我无法弄清楚我的第一层的 input_shape 必须是什么。有人可以请教吗?谢谢

供参考,我使用的方法:

def windowed_dataset(series, window_size, batch_size, shuffle_buffer=None):

    series = tf.expand_dims(series, axis=-1)
    dataset = tf.data.Dataset.from_tensor_slices(series)
    dataset = dataset.window(window_size + 1, shift=1, drop_remainder=True)
    dataset = dataset.flat_map(lambda window: window.batch(window_size + 1))

    if shuffle_buffer != None: 
        dataset = dataset.shuffle(shuffle_buffer)
    dataset = dataset.map(
        lambda window: (window[:-1], window[-1]))
    dataset = dataset.batch(batch_size).prefetch(1)

    return dataset 

数据集(Dataframe.to_numpy()):

array([[0.86749387, 0.87223695, 0.02077445, 0.87542179],
       [0.86755952, 0.87322277, 0.02047971, 0.87551724],
       [0.86749387, 0.8733104 , 0.01424521, 0.8756016 ],
       ...,
       [0.18539916, 0.19000153, 0.00700078, 0.18666753],
       [0.18325455, 0.19000153, 0.        , 0.18610588],
       [0.18636204, 0.19144741, 0.00573779, 0.18572627]])

我的第一层:

Conv1D(filters=128, kernel_size=3, strides=1, padding='causal', input_shape=[None, None, window_size, 4] , activation='relu'),

错误:

    ValueError: Input 0 of layer sequential_53 is incompatible with the layer: expected axis -1 of input shape to have value 4 but received input with shape (None, None, 4, 1)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/tmp/ipykernel_21174/3802335098.py in <module>
----> 1 history = model.fit(train_dataset, epochs=epochs, batch_size=batch_size, shuffle=False, verbose=1)

【问题讨论】:

    标签: python tensorflow machine-learning keras time-series


    【解决方案1】:

    对于具有 32 个批次、128 个窗口和 4 个特征的时间序列,您的输入形状将是: (无,批次数(Nb),批次大小(Bs),窗口大小(Ws),4) 但是你应该指定的是:

    shape=(None, None, Ws, 4)
    

    First None: for Nb (because Nb can vary)
    Scd None : for Bs (Because Bs can vary)
    

    但我不明白你为什么会得到:

    shape=(None, None, 4, 1)
    

    【讨论】:

    • 是的,这对我来说没有意义,我正在努力解决这个问题。对于其他练习,我通常只设置行和列,但由于我使用的是 tf.data.Dataset.from_tensor_slices(),它的工作方式不一样
    • @CharltonZ1 我刚刚编辑了我的答案。我之前犯了一个错误。
    • 我已经尝试过了,到目前为止,我一直收到这个错误:``` ValueError: 层序 53 的输入 0 与层不兼容:输入形状的预期轴 -1 有值4 但接收到的输入形状为 (None, None, 4, 1) ```
    • @CharltonZ1 我建议您遵循tensorflow.org/tutorials/structured_data/… 此处所做的操作。你可能会得到答案。
    • 您得到的错误可能意味着您的输入数据格式错误。如果您可以提供更多代码来检查内部内容,尤其是格式化输入数据的代码。
    猜你喜欢
    • 2022-07-26
    • 2019-10-27
    • 2021-05-20
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 2020-09-26
    相关资源
    最近更新 更多