Python 我可以通过什么方式使用不同尺寸的图像集作为预训练模型的输入?

Python 我可以通过什么方式使用不同尺寸的图像集作为预训练模型的输入?,python,tensorflow,keras,conv-neural-network,Python,Tensorflow,Keras,Conv Neural Network,我正在研究一个手写数字识别问题,使用OpenCV进行预处理,使用Keras/Tensorflow进行推理。我在MNIST手写数字数据集上训练了一个模型,其中每个图像是28x28像素。现在我正在使用一组新的数字,我计划使用原始模型架构进行进一步培训,并通过重量初始化进行转移学习 这就是我的问题:当我缩小到28x28像素时,我遇到了丢失某些功能的问题。这里有一个例子 这意味着是一个2,而顶部环路中的微小间隙对于帮助区分9或8非常重要。但是我的预处理版本丢失了间隙,因此循环看起来是闭合的 我已经发布

我正在研究一个手写数字识别问题,使用OpenCV进行预处理,使用Keras/Tensorflow进行推理。我在MNIST手写数字数据集上训练了一个模型,其中每个图像是28x28像素。现在我正在使用一组新的数字,我计划使用原始模型架构进行进一步培训,并通过重量初始化进行转移学习

这就是我的问题:当我缩小到28x28像素时,我遇到了丢失某些功能的问题。这里有一个例子

这意味着是一个2,而顶部环路中的微小间隙对于帮助区分9或8非常重要。但是我的预处理版本丢失了间隙,因此循环看起来是闭合的

我已经发布了关于如何在不丢失功能的情况下进行精简的帖子。另一方面,也许我想缩小到更大的尺寸,比如56x56像素,这样我就不太可能丢失这些功能如何设置,使新尺寸与模型融合,而不使预先训练的权重无效?

以下是预培训模型的定义:

def define_model(learning_rate, momentum):
    model = Sequential()
    model.add(Conv2D(32, (3,3), activation = 'relu', kernel_initializer = 'he_uniform', input_shape=(28,28,1)))
    model.add(MaxPooling2D((2,2)))
    model.add(Conv2D(64, (3,3), activation = 'relu', kernel_initializer = 'he_uniform'))
    model.add(Conv2D(64, (3,3), activation = 'relu', kernel_initializer = 'he_uniform'))
    model.add(MaxPooling2D((2,2)))
    model.add(Flatten())
    model.add(Dense(100, activation='relu', kernel_initializer='he_uniform'))
    model.add(Dense(10, activation='softmax'))
    opt = SGD(lr=learning_rate, momentum=momentum)
    model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
    return model

我有一个想法:在第一层之后增加max pool内核的大小,使该层的输出具有与我使用的28x28像素图像相同的形状。(但这不会导致我丢失该功能吗?

为什么不升级MNST进行培训?你的问题是关于图像的分辨率,MNST数据集是很久以前创建的,当时GPU内存还很小。最近的模型的图像尺寸都大于
200*200
,例如,resnet使用
224*224
作为输入形状。因为你的图像从一开始就已经是低分辨率的,你缩小了尺寸,你会使模型很难区分彼此。由于您的模型相当简单,因此我建议对培训数据集进行升级

是的,如果您使用您提到的池,您可能也会丢失信息


希望这能有所帮助。

一个选项将如上面所建议的那样-例如,将初始数据集从
28x28
放大到
56x56

第二个选项是在训练模型的开头添加一个额外的
MaxPooling
AveragePooling
层,例如:

new_input = Input(shape=(56, 56, 1), name='new_input')
x = AveragePooling2D((2,2), name='avg_pool')(new_input)
new_output = trained_model(x)
new_model = Model(new_input, new_output)
以下是新模型的摘要:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
new_input (InputLayer)       (None, 56, 56, 1)         0         
_________________________________________________________________
avg_pool (AveragePooling2D)  (None, 28, 28, 1)         0         
_________________________________________________________________
trained_model (Sequential)   (None, 10)                159254    
=================================================================
Total params: 159,254
Trainable params: 159,254
Non-trainable params: 0
_________________________________________________________________

哦,太好了,谢谢。这很有帮助!您知道任何原始大小大于28x28的数据集吗?我询问的原因是,在预培训时捕获MNIST数据集的原始功能会很好。@AlexanderSoare,原始功能在这里。你也可以发电子邮件给作者,他们可能在某个地方有原始的,但是他们很怀疑他们会回复你。还要检查洞察力。希望这有帮助。谢谢。虽然如果我在中添加这个池层,我想我会丢失我感兴趣的功能,对吗?为了不丢失您感兴趣的图像区域(功能),您可以使用AveragePooling或MinPooling而不是MaxPooling(这些都只是缩小初始图像大小的方法)。虽然这不是保证,但我认为值得一试。