【问题标题】:Keras CNN Error: expected Sequence to have 3 dimensions, but got array with shape (500, 400)Keras CNN 错误:预期序列具有 3 个维度,但得到了形状为 (500、400) 的数组
【发布时间】:2019-04-27 03:37:24
【问题描述】:

我收到此错误:

ValueError:检查输入时出错:预期序列具有 3 个维度,但得到的数组形状为 (500, 400)

这些是我正在使用的以下代码。

print(X1_Train.shape)
print(X2_Train.shape)
print(y_train.shape)

输出(这里我每行有 500 行):

(500, 400)
(500, 1500)
(500,)

400 => timesteps (below)
1500 => n (below)

代码:

timesteps = 50 * 8
n = 50 * 30

def createClassifier():
    sequence = Input(shape=(timesteps, 1), name='Sequence')
    features = Input(shape=(n,), name='Features')

    conv = Sequential()
    conv.add(Conv1D(10, 5, activation='relu', input_shape=(timesteps, 1)))
    conv.add(Conv1D(10, 5, activation='relu'))
    conv.add(MaxPool1D(2))
    conv.add(Dropout(0.5))

    conv.add(Conv1D(5, 6, activation='relu'))
    conv.add(Conv1D(5, 6, activation='relu'))
    conv.add(MaxPool1D(2))
    conv.add(Dropout(0.5))
    conv.add(Flatten())
    part1 = conv(sequence)

    merged = concatenate([part1, features])

    final = Dense(512, activation='relu')(merged)
    final = Dropout(0.5)(final)
    final = Dense(num_class, activation='softmax')(final)

    model = Model(inputs=[sequence, features], outputs=[final])
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

model = createClassifier()
# print(model.summary())
history = model.fit([X1_Train, X2_Train], y_train, epochs =5)

有什么见解吗?

【问题讨论】:

    标签: python machine-learning keras conv-neural-network


    【解决方案1】:

    两件事-

    Conv1D 层期望输入的形状为(batch_size, x, filters),在您的情况下为(500,400,1)。
    您需要重塑您的输入层,添加另一个轴,大小为 1。(这不会改变您的数据中的任何内容)。

    您正在尝试使用多个输入,Sequential API 不是最好的选择。我建议使用Functional API

    编辑: 关于您的评论,不确定您做错了什么,但这是您的代码的工作版本(带有假数据),具有重塑:

    import keras
    
    import numpy as np
    
    
    
    X1_Train = np.ones((500,400))
    X2_Train = np.ones((500,1500))
    y_train = np.ones((500))
    print(X1_Train.shape)
    print(X2_Train.shape)
    print(y_train.shape)
    
    num_class = 1
    
    
    timesteps = 50 * 8
    n = 50 * 30
    
    def createClassifier():
        sequence = keras.layers.Input(shape=(timesteps, 1), name='Sequence')
        features = keras.layers.Input(shape=(n,), name='Features')
    
        conv = keras.Sequential()
        conv.add(keras.layers.Conv1D(10, 5, activation='relu', input_shape=(timesteps, 1)))
        conv.add(keras.layers.Conv1D(10, 5, activation='relu'))
        conv.add(keras.layers.MaxPool1D(2))
        conv.add(keras.layers.Dropout(0.5))
    
        conv.add(keras.layers.Conv1D(5, 6, activation='relu'))
        conv.add(keras.layers.Conv1D(5, 6, activation='relu'))
        conv.add(keras.layers.MaxPool1D(2))
        conv.add(keras.layers.Dropout(0.5))
        conv.add(keras.layers.Flatten())
        part1 = conv(sequence)
    
        merged = keras.layers.concatenate([part1, features])
    
        final = keras.layers.Dense(512, activation='relu')(merged)
        final = keras.layers.Dropout(0.5)(final)
        final = keras.layers.Dense(num_class, activation='softmax')(final)
    
        model = keras.Model(inputs=[sequence, features], outputs=[final])
        model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
        return model
    
    model = createClassifier()
    # print(model.summary())
    X1_Train = X1_Train.reshape((500,400,1))
    history = model.fit([X1_Train, X2_Train], y_train, epochs =5)
    

    有输出:

    Using TensorFlow backend.
    (500, 400)
    (500, 1500)
    (500,)
    Epoch 1/5
    500/500 [==============================] - 1s 3ms/step - loss: 1.1921e-07 - acc: 1.0000
    Epoch 2/5
    500/500 [==============================] - 0s 160us/step - loss: 1.1921e-07 - acc: 1.0000
    Epoch 3/5
    500/500 [==============================] - 0s 166us/step - loss: 1.1921e-07 - acc: 1.0000
    Epoch 4/5
    500/500 [==============================] - 0s 154us/step - loss: 1.1921e-07 - acc: 1.0000
    Epoch 5/5
    500/500 [==============================] - 0s 157us/step - loss: 1.1921e-07 - acc: 1.0000
    

    【讨论】:

    • 相应更改为 (500, 400, 1)。但它没有用。我仍然收到错误消息。我根据功能 API 更改了 CNN 层。但是,我收到以下错误。 tensorflow.python.framework.errors_impl.InvalidArgumentError: indices[22,330] = -1 is not in [0, 400)
    • 不确定你在重塑时做错了什么,编辑并添加了代码的工作版本,带有假数据,请注意我只添加了重塑线。
    猜你喜欢
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2018-07-18
    • 2019-09-04
    • 2018-05-15
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    相关资源
    最近更新 更多