【发布时间】:2021-02-14 03:54:19
【问题描述】:
我有一个 27G 的数据集要分析,由于我的 RAM 的大小,我无法一次将所有数据输入到我的神经网络中,我必须导入其中的一部分,学习它们,然后再导入另一个部分,所以这个过程看起来像这样:
- 导入 10% 的数据
- 学习
- 保存模型
- 删除内存中的数据
- 导入接下来的 10% 以此类推
为了了解这将如何影响已知数据集,我在 MNIST 上对其进行了测试。以下是流程/程序:
for 35 times:
import 1/5 of the data
learn
delete
import the next 1/5
learn
delete
...
这是从 tensorflow 导入数据集的代码:
from tensorflow.keras.datasets import mnist
(sep, label), (sep_t, label_t) = mnist.load_data()
然后,网络:
Dense = tf.keras.layers.Dense
fc_model = tf.keras.Sequential(
[
tf.keras.Input(shape=(28,28)),
tf.keras.layers.Flatten(),
Dense(128, activation='relu'),
Dense(32, activation='relu'),
Dense(10, activation='softmax')])
fc_model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
下面是MNIST数据集部分导入学习的代码:
for k in range(35):
for j in range(5):
if i == 0:
history = fc_model.fit(sep[i*12000:(i+1)*12000-1], label[i*12000:(i+1)*12000-1], batch_size=128, validation_data=(sep_t, label_t) ,epochs=1)
fc_model.save('Mytf.h5')
i = i + 1
else:
fc_model = load_model('Mytf.h5')
history = fc_model.fit(sep[i*12000:(i+1)*12000-1], label[i*12000:(i+1)*12000-1], batch_size=128, validation_data=(sep_t, label_t) ,epochs=1)
fc_model.save('Mytf.h5')
valacc.append(history.history['val_accuracy'])
valacc_epc.append(history.history['val_accuracy'])
以下是学习整个数据集中数据的代码:
history_new = fc_model.fit(sep, label, batch_size=128, validation_data=(sep_t, label_t) ,epochs=35)
下图是两种方法在验证数据准确性方面的比较:
即使差异约为 1% (96(avg)-95(avg)=1%),这是否意味着当使用相同的保存和学习方法对不同的数据集进行测试时,这会导致减少准确性?在云计算平台上做一些投资会更好吗?
【问题讨论】:
-
这就是数据生成器的用途。您的解决方案可能会产生一些奇怪的影响,尤其是批次的组织方式以及某些训练数据是否比其他数据更容易看到。
-
@runDOSrun 那么有什么方法可以在 RAM 有限的大型数据集上学习?
标签: python tensorflow machine-learning neural-network tf.keras