为了训练神经网络,我修改了在YouTube上找到的一段代码。它的样子如下:
现在,我尝试使用这段代码来训练神经网络,训练样本大小为105,000(图像文件,其中包含37种可能性中的8个字符,包括A-Z、0-9和空格)。 我使用了相对较小的批次大小(32,我认为已经太小了),以使它更加高效,但即使如此,训练一个季度的第一轮(每轮有826个步骤)也要花费很长时间(199个步骤需要90分钟...
数据生成器包括以下函数:
def data_generator(samples, batch_size, shuffle_data = True, resize=224):
num_samples = len(samples)
while True:
random.shuffle(samples)
for offset in range(0, num_samples, batch_size):
batch_samples = samples[offset: offset + batch_size]
X_train = []
y_train = []
for batch_sample in batch_samples:
img_name = batch_sample[0]
label = batch_sample[1]
img = cv2.imread(os.path.join(root_dir, img_name))
#img, label = preprocessing(img, label, new_height=224, new_width=224, num_classes=37)
img = preprocessing(img, new_height=224, new_width=224)
label = my_onehot_encoded(label)
X_train.append(img)
y_train.append(label)
X_train = np.array(X_train)
y_train = np.array(y_train)
yield X_train, y_train
现在,我尝试使用这段代码来训练神经网络,训练样本大小为105,000(图像文件,其中包含37种可能性中的8个字符,包括A-Z、0-9和空格)。 我使用了相对较小的批次大小(32,我认为已经太小了),以使它更加高效,但即使如此,训练一个季度的第一轮(每轮有826个步骤)也要花费很长时间(199个步骤需要90分钟...
steps_per_epoch = num_train_samples // batch_size
)。数据生成器包括以下函数:
def shuffle_data(data):
data=random.shuffle(data)
return data
我认为我们无法使此函数更加高效或将其从生成器中排除。
def preprocessing(img, new_height, new_width):
img = cv2.resize(img,(new_height, new_width))
img = img/255
return img
为了预处理/调整数据,我使用以下代码将图像调整到唯一大小(例如(224, 224, 3))。 我认为,生成器的这部分需要最长时间,但我没有看到从生成器中排除它的可能性(如果我们在批处理外调整图像,我的内存会被占满)。
#One Hot Encoding of the Labels
from numpy import argmax
# define input string
def my_onehot_encoded(label):
# define universe of possible input values
characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ '
# define a mapping of chars to integers
char_to_int = dict((c, i) for i, c in enumerate(characters))
int_to_char = dict((i, c) for i, c in enumerate(characters))
# integer encode input data
integer_encoded = [char_to_int[char] for char in label]
# one hot encode
onehot_encoded = list()
for value in integer_encoded:
character = [0 for _ in range(len(characters))]
character[value] = 1
onehot_encoded.append(character)
return onehot_encoded
我认为,在这部分中可以采用一种方法使其更加高效。我想将此代码从生成器中排除,并在生成器之外产生y_train数组,以便生成器不必每次对标签进行单热编码。
你认为呢?或者我应该选择完全不同的方法吗?