【问题标题】:ValueError: Layer sequential expects 1 input(s), but it received 239 input tensorsValueError:层顺序需要 1 个输入,但它接收到 239 个输入张量
【发布时间】:2021-09-02 23:41:13
【问题描述】:

我正在尝试测试一个简单的卷积层,其中输入图像(1 个波段 = 灰度)是存储在列表中的 numpy 数组,目标存储在 pandas 数据帧中。输入图像的大小为 16x16。 model.fit 的输出是“层顺序需要 1 个输入,但它收到 239 个输入张量”的错误。我还检查了this link,但仍然找不到答案。谁能帮我解决这个错误?

(trainY, testY, trainX, testX) = train_test_split(df, images, test_size=0.20, random_state=42)
print (np.shape(trainY),np.shape(testY),np.shape(trainX),np.shape(testX))

result: (239, 1) (60, 1) (239, 16, 16) (60, 16, 16)

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(16, 16, 1),name='Layer1'))
model.add(layers.Flatten())
model.add(layers.Dense(16, activation='relu',name='layer2'))
model.add(layers.Dense(1,activation='linear',name='Layer3'))
model.summary()

model.compile(optimizer='adam',
              loss='mean_squared_error',
              metrics=['mae'])

history = model.fit(trainX, trainY, epochs=10, 
                    validation_split=.2, batch_size=4)

【问题讨论】:

    标签: python keras regression conv-neural-network


    【解决方案1】:

    模型架构中定义的模型预期的输入是

    input_shape=(16, 16, 1)
    

    因此,在训练时,您可以发送一批 16X16 单通道 (X1) 图像。但是您的数据形状是(239, 16, 16)。即您有一批 239 张 16X16 的图像。您所要做的就是将16X16 重塑为16X16X1。由于您的数据位于 numpy 数组中,因此您可以使用 expand_dim 执行此操作。

    trainX = np.expand_dims(trainX, -1)
    

    固定代码

    model = models.Sequential()
    model.add(layers.Conv2D(32, (3, 3), activation='relu', 
                            input_shape=(16, 16, 1),name='Layer1'))
    model.add(layers.Flatten())
    model.add(layers.Dense(16, activation='relu',name='layer2'))
    model.add(layers.Dense(1,activation='linear',name='Layer3'))
    
    model.compile(optimizer='adam',
                  loss='mean_squared_error',
                  metrics=['mae'])
    
    trainY = np.random.randint(0,10, (239, 1))
    trainX = np.random.randn(239, 16, 16)
    
    trainX = np.expand_dims(trainX, -1)
    history = model.fit(trainX, trainY, epochs=10, validation_split=.2, batch_size=4)
    

    【讨论】:

    • 谢谢。我设法通过您的回答运行了代码。我需要用十进制值保留 trainX 和 trainY。请问trainY = np.random.randint(0,10, (239, 1)) and trainX = np.random.randn(239, 16, 16)的作用是什么?是否有任何十进制值到整数的转换?
    • 我想我应该删除trainY = np.random.randint(0,10, (239, 1)) and trainX = np.random.randn(239, 16, 16)。我说的对吗?
    • 是的 randn 是为了生成合成数据,您必须将其删除。在 trainXtestX 上执行 expad_dim
    猜你喜欢
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 2021-09-28
    相关资源
    最近更新 更多