我是机器学习和深度学习的新手,为了学习目的,我尝试使用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) 所以我有一个用Tensorflow编写的非常简单的NN脚本,我很难找到一些"随机性"来自哪里.
我记录了
当我训练时,我的网络,并且在第一次迭代中,很明显一切都是从一开始.我有一个SEED值,用于读取数据的方式,以及用于初始化网络权重的SEED值.那些我永远不会改变.
我的问题是,比如我每次重新运行的第二次迭代,我开始看到渐变发散,(少量,比如说,1e-6左右).然而,随着时间的推移,这当然会导致不可重复的行为.
这可能是什么原因?我不知道任何可能的随机来源可能来自哪里......
谢谢
这可能是一个非常基本的问题,但是我无法找到答案:当我使用 Keras 使用批处理训练网络时,控制台输出显示并不断更新训练集的当前损失值的显示每个训练时期。据我了解,该损失值是在当前批次上计算的(作为总体损失的代理),并且可能与为先前批次计算的损失值进行平均。但获取当前批次的损失值有两种可能:更新参数之前或之后。有人能告诉我这两个哪个是正确的吗?根据我的观察,我宁愿猜测它是在优化步骤之后。
我问这个问题的原因是:我正在训练一个网络,发现训练损失(两个嵌入的 MSE)会按预期减少(几个数量级),但验证损失保持不变。首先我认为这可能是由于过度拟合。因此,由于训练数据集相当大(200k 图像),我决定减小 epoch 大小,以便能够更频繁地看到验证集的评估,从而导致 epoch 小于trainingSetSize/batchSize。即使这样,我也看到训练损失从一个纪元到另一个纪元不断减少(验证损失仍然保持不变),我发现这非常有趣,因为网络仍然处于第一次看到训练数据的阶段。根据我的理解,这意味着我的设置中存在一些令人讨厌的错误,或者在采取优化步骤后显示了显示的训练损失。否则,新的、从未见过的批次和验证集的损失应该至少表现相似。
即使我假设损失是在每个优化步骤之后计算的:假设我的网络没有按照验证集评估的建议取得有用的进展,那么当看到新的、从未见过的批次时,它也应该表现得任意。然后,训练损失的整体减少将仅归因于优化步骤(这对于手头的批次非常有好处,但对于其他数据则不然,显然,这也是一种过度拟合)。这意味着,如果训练损失不断减少,每批的优化步骤就会变得更加有效。我正在使用 Adam 优化器,我知道它是自适应的,但是是否真的有可能看到训练损失持续大幅减少,而实际上网络没有学习任何有用的泛化?