相关疑难解决方法(0)

ResNet:训练期间的准确率为100%,但使用相同数据的预测准确率为33%

我是机器学习和深度学习的新手,为了学习目的,我尝试使用Resnet.我试图过度填充小数据(3个不同的图像),看看我是否可以获得几乎0的损失和1.0的准确度 - 我做到了.

问题是对训练图像的预测(即用于训练的相同3个图像)不正确.

训练图像

图片1 图片2 图片3

图像标签

[1,0,0],[0,1,0],[0,0,1]

我的python代码

#loading 3 images and resizing them
imgs = np.array([np.array(Image.open("./Images/train/" + fname)
                          .resize((197, 197), Image.ANTIALIAS)) for fname in
                 os.listdir("./Images/train/")]).reshape(-1,197,197,1)
# creating labels
y = np.array([[1,0,0],[0,1,0],[0,0,1]])
# create resnet model
model = ResNet50(input_shape=(197, 197,1),classes=3,weights=None)

# compile & fit model
model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=['acc'])

model.fit(imgs,y,epochs=5,shuffle=True)

# predict on training data
print(model.predict(imgs))
Run Code Online (Sandbox Code Playgroud)

该模型过度拟合数据:

3/3 [==============================] - 22s - loss: 1.3229 - acc: 0.0000e+00
Epoch 2/5
3/3 [==============================] - 0s - …
Run Code Online (Sandbox Code Playgroud)

machine-learning deep-learning keras

25
推荐指数
1
解决办法
9940
查看次数

如何选择减少过度拟合的策略?

我正在使用keras在经过预训练的网络上应用转移学习。我有带有二进制类别标签的图像补丁,并且想使用CNN预测范围为[0; 1]用于看不见的图像补丁。

  • 网络:ResNet50经过imageNet的预培训,在其中添加了3层
  • 数据:70305个训练样本,8000个验证样本,66823个测试样本,所有样本均带有均衡数量的两个类别标签
  • 图像:3波段(RGB)和224x224像素
  • 设置:32个批次,转换大小 层数:16

  • 结果:经过几个时期,我的准确度已经接近1,而损失接近0,而在验证数据上,准确度保持在0.5,并且每个时期的损失都在变化。最后,CNN会针对所有看不见的补丁预测仅一个类别。

  • 问题:似乎我的网络过度拟合。

结果截图 在此处输入图片说明

以下策略可以减少过度拟合:

  • 增加批量
  • 减小全连接层的大小
  • 添加退出层
  • 添加数据扩充
  • 通过修改损失函数应用正则化
  • 解冻更多的预训练层
  • 使用不同的网络架构

我尝试了批量大小最大为512的示例,并且更改了全连接层的大小,但没有取得太大的成功。在随机测试其余部分之前,我想问一下如何调查出什么问题了,以找出上述哪种策略最具潜力

在我的代码下面:

def generate_data(imagePathTraining, imagesize, nBatches):
    datagen = ImageDataGenerator(rescale=1./255)
    generator = datagen.flow_from_directory\
        (directory=imagePathTraining,                           # path to the target directory
         target_size=(imagesize,imagesize),                     # dimensions to which all images found will be resize
         color_mode='rgb',                                      # whether the images will be converted to have 1, 3, or 4 channels
         classes=None,                                          # optional list of class subdirectories
         class_mode='categorical',                              # type …
Run Code Online (Sandbox Code Playgroud)

python machine-learning deep-learning keras tensorflow

7
推荐指数
1
解决办法
216
查看次数

具有预先训练的卷积基数的keras模型中损失函数的奇异行为

我正在尝试在Keras中创建模型,以便根据图片进行数值预测。我的模型具有densitynet121卷积基础,顶部还有几个附加层。除最后两个图层外的所有图层均设置为layer.trainable = False。我的损失是均方误差,因为这是一项回归任务。在训练期间,我得到loss: ~3,而对同一批数据的评估给出loss: ~30

model.fit(x=dat[0],y=dat[1],batch_size=32)
Run Code Online (Sandbox Code Playgroud)

时代1/1 32/32 [==============================]-0s 11ms / step-损耗:2.5571

model.evaluate(x=dat[0],y=dat[1])
Run Code Online (Sandbox Code Playgroud)

32/32 [==============================]-2s 59ms / step 29.276123046875

在训练和评估期间,我提供了完全相同的32张图片。我还使用的预测值计算了损失y_pred=model.predict(dat[0]),然后使用numpy构造了均方误差。结果与我从评估中得到的结果相同(即29.276123 ...)。

有人建议这种行为可能是由于BatchNormalization卷积基础中的层(有关github的讨论)。当然,BatchNormalization我模型中的所有图层也都已设置layer.trainable=False为。也许有人遇到了这个问题并想出了解决方案?

python deep-learning keras tensorflow transfer-learning

6
推荐指数
1
解决办法
2690
查看次数