【问题标题】:Using dynamic input shape in keras在 keras 中使用动态输入形状
【发布时间】:2020-06-06 20:26:16
【问题描述】:

我正在处理一些包含某些连续天数的数据,每个数据的数组形状如下:
(number of days, 1, number of features)

每个数据中的特征数量不同。
我想将这些数据中的每一个分别提供给我的 lstm 模型。所以我想以一种动态输入形状的方式来实现我的模型。

我用过这段代码:

model = Sequential()
model.add(LSTM(4, return_sequences=True, input_shape=(1, None)))
model.add(LSTM(256, dropout=0.2,recurrent_dropout=0.2, return_sequences=True))
model.add(LSTM(256, dropout=0.2,recurrent_dropout=0.2, return_sequences=True))
model.add(LSTM(128, dropout=0.2,recurrent_dropout=0.2, return_sequences=True))
model.add(LSTM(128))
model.add(Dense(1, activation='sigmoid'))

model.compile (
    loss='mean_squared_error',
    optimizer=keras.optimizers.Adam(0.001)
)

第一层中的None 表示特征数量。但是当我开始在(X_train 和 y_train)上拟合模型时,我得到了这个层的错误:

TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

我使用的是 tensorflow 版本 '2.3.0-tf'

你能帮我解决这个错误吗?

【问题讨论】:

    标签: python tensorflow keras deep-learning lstm


    【解决方案1】:

    函数pad_sequences 在这种情况下会很有用。

    例如Input Sequences有不同的Features个数,如下图:

    sequences = [
        [1, 2, 3, 4],
           [1, 2, 3],
                 [1]
        ]
    

    我们可以使用pad_sequences使所有Features等长,如下图:

    padded = pad_sequences(sequences)
    

    这将使Input Sequence:

    [[1 2 3 4]
     [0 1 2 3]
     [0 0 0 1]]
    

    也就是说,它将用Zeros 填充另一个Features,并使所有样本的Features 的数量为4(其中最大)。

    PaddingZeros 可以通过调整参数“填充”在startend 完成。有关此功能的更多详细信息,请参阅Tensorflow Documentation

    具有可变数量的功能的完整工作代码如下所示:

    from tensorflow.keras.preprocessing.sequence import pad_sequences
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense, LSTM
    import tensorflow as tf
    import numpy as np
    
    
    # define sequences
    sequences = [
        [1, 2, 3, 4],
           [1, 2, 3],
                 [1]
        ]
    
    # pad sequence
    padded = pad_sequences(sequences)
    print(padded)
    X = np.expand_dims(padded, axis = 0)
    print(X.shape) # (1, 3, 4)
    
    y = np.array([1,0,1])
    y = y.reshape(1,-1)
    print(y.shape) # (1, 3)
    
    model = Sequential()
    model.add(LSTM(4, return_sequences=False, input_shape=(None, X.shape[2])))
    model.add(Dense(1, activation='sigmoid'))
    
    model.compile (
        loss='mean_squared_error',
        optimizer=tf.keras.optimizers.Adam(0.001))
    
    model.fit(x = X, y = y)
    

    以上代码的输出是:

    [[1 2 3 4]
     [0 1 2 3]
     [0 0 0 1]]
    
    (1, 3, 4)
    
    (1, 3)
    
    1/1 [==============================] - 0s 1ms/step - loss: 0.2601
    

    希望这会有所帮助。快乐学习!

    【讨论】:

    猜你喜欢
    • 2018-02-16
    • 1970-01-01
    • 2020-06-10
    • 2017-08-14
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    相关资源
    最近更新 更多