我一直在训练一个神经网络,用于识别手写纸张和绘图纸张之间的差异。我的图像尺寸都是(3508, 2480),我使用CNN来完成这项任务,问题是训练花费的时间太长了。我有30,000张数据,分为两类,并分为验证和训练集,因此我有:
- 13650张手写段落的训练图像
- 13650张绘图的训练图像
- 1350张绘图的验证图像
- 1250张绘图的验证图像
如果你想查看我的架构,这里是我的
这是我的代码:
import tensorflow as tfimport osimport matplotlib.pyplot as pltimport matplotlib.image as mpimgimport numpy as npfrom google.colab import drivedrive.mount('/content/drive')
l0 = tf.keras.layers.Conv2D(32, (60,60), activation='relu', input_shape=(438, 310, 1), name='input')l1 = tf.keras.layers.Dropout(.3)l2 = tf.keras.layers.BatchNormalization()l3 = tf.keras.layers.MaxPool2D(pool_size=(2,2),padding='same')l12 = tf.keras.layers.Flatten()l16 = tf.keras.layers.Dense(32, activation='relu')l17 = tf.keras.layers.Dropout(.5)l18 = tf.keras.layers.BatchNormalization()l22 = tf.keras.layers.Dense(1, activation='sigmoid', name='output')
from keras.preprocessing.image import ImageDataGeneratortrdata = ImageDataGenerator(rescale=1/255)traindata = trdata.flow_from_directory("/content/drive/MyDrive/Sae/TesisProgra/DataSets/ParagraphsVsDrawings/Paste/0_Final/Training",target_size=(438, 310), color_mode="grayscale", batch_size=250)valdata = ImageDataGenerator(rescale=1/255)validationdata = valdata.flow_from_directory("/content/drive/MyDrive/Sae/TesisProgra/DataSets/ParagraphsVsDrawings/Paste/0_Final/Validation",target_size=(438, 310), color_mode="grayscale", batch_size=250)
from keras.callbacks import ModelCheckpoint, EarlyStoppingcheckpoint = ModelCheckpoint("ParagraphsVsDrawings.h5", monitor='val_accuracy', verbose=1, save_best_only=True, save_weights_only=False, save_freq='epoch', mode='auto')history = model.fit(traindata, validation_data=validationdata, validation_steps=10,epochs=20, verbose=True, callbacks=[checkpoint])
我在使用Google Colab PRO进行训练,并启用了TPU和大内存选项
我之前训练过CNN,它们训练得非常快,我不知道是不是因为我的图像太大,也许我可以尝试用pillow调整大小,但我现在真的迷失了方向,我已经等了12个小时,它还在第一轮训练
回答:
你的卷积核大小60×60相当大。尝试使用3×3或5×5的卷积核。看起来图像大小不是问题,因为你已经从(3508, 2480)调整到了(438, 310)。
另外,请注意你的权重数量非常非常大,大约有2400万个。这是因为你将一个(189, 125, 32)形状的数组展平,然后下一层(Dense层)有32个单元,所以那一层有189 * 125 * 32 * 32个权重。这将需要非常非常长的时间来训练。
尝试再添加一到两个卷积层和池化层,以便展平后的权重数量可以管理。