我是机器学习和深度学习的新手,为了学习目的,我尝试使用Resnet.我试图过度填充小数据(3个不同的图像),看看我是否可以获得几乎0的损失和1.0的准确度 - 我做到了.
问题是对训练图像的预测(即用于训练的相同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) 我正在使用keras在经过预训练的网络上应用转移学习。我有带有二进制类别标签的图像补丁,并且想使用CNN预测范围为[0; 1]用于看不见的图像补丁。
设置: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) 我正在尝试在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为。也许有人遇到了这个问题并想出了解决方案?