以图像为输入和单像素输出的神经网络

Neural Network with images as input and single pixels output

我正在尝试训练一个 NN,它应该 return 具有 90x90 图像作为输入的单个像素图像。 数据集由 1000 张 RGB 图像组成一个 numpy 数组,因此输入的形状为 (1000, 90, 90, 3),目标输出包含 1000 张由每个图像中最亮的像素组成的 RGB 图像,因此形状为 (1000, 1, 1, 3).

模型的拟合效果似乎很好,损失值合理,但是当我 运行 预测时,我得到了 90x90 图像的输出。

我尝试了使用 Conv2D 层、密集层、MaxPooling2D 的不同类型的模型,并以不同的方式将它们与不同的参数混合,但我无法获得 1x1 的输出。

编辑 我已经尝试了 BestDogeWhosebug 建议的方式,我认为它有效。这里是网络:

def create_model():
    x = Input(shape=(64,64,3))# Encoder
    pool1 = MaxPooling2D((2, 2), padding='same')(x)
    pool2 = MaxPooling2D((2, 2), padding='same')(pool1)    
    pool3 = MaxPooling2D((2, 2), padding='same')(pool2)    
    pool4 = MaxPooling2D((2, 2), padding='same')(pool3)    
    pool5 = MaxPooling2D((2, 2), padding='same')(pool4)
    pool6 = MaxPooling2D((2, 2), padding='same')(pool5)   
    r = Conv2D(3, (1, 1), activation='linear', padding='same')(pool6)  
    model = Model(x, r)
    model.compile(optimizer='adam', loss='mse')
    return model
    
model = create_model()
model.compile(optimizer='adam', loss=losses.MeanSquaredError())
model.fit(X_train, y_train,
                batch_size=10,
                epochs=20,
                shuffle=True,
                validation_data=(X_test, y_test))

现在预测的形状是预期的:

predict = encoder.predict(
    X_test, batch_size=None, verbose=0, steps=None, callbacks=None, max_queue_size=10,
    workers=1, use_multiprocessing=False)

print (predict.shape)

(330, 1, 1, 3)

model.summary() return这个可以吗?

Model: "model_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
Total params: 12
Trainable params: 12
Non-trainable params: 0
_________________________________________________________________

如果你想要一个 1x1 的图像作为输出(这听起来真的像是在任何情况下都没有人愿意做的事情)你需要使用一个全卷积神经网络层来减少图像维度,你需要使用转置卷积和 maxpooling 等层将维度减少到 1,但 90x90 不起作用,您需要调整图像大小以使其维度为 2 的幂(例如 128x128 或 64x64),然后使用足够的 maxpooling 直到达到输出的 1x1 维度。