我正在尝试学习神经网络! 我正在尝试在100 x 100像素字符的OCR上比较卷积神经网络和密集神经网络。 我正在修改David Shapiro在OCR上的代码,以创建一个ANN与他的CNN模型进行比较。 https://github.com/daveshap/ocr_svc
他的随机字符图像生成器生成100 x 100(我将其从32x32修改为100x100,以真正看到过拟合的效果-如果发生的话)
def make_random_image(font_file, c, i):
paper = 255 #white
ink = random.randint(0, 90)
font_size = random.randint(min_font, max_font)
font = ImageFont.truetype(font_dir + font_file, font_size)
string = c
canvas = Image.new('RGBA', (base_size, base_size), (paper, paper, paper))
draw = ImageDraw.Draw(canvas)
w, h = draw.textsize(text=string, font=font)
w = round((base_size - w) / 2)
h = round((base_size - h) / 2)
draw.text((w, h), string, (ink, ink, ink), font=font)
ImageDraw.Draw(canvas)
canvas = Image.fromarray(np.uint8(canvas))
# save file
filename = font_file.lower().replace('.ttf', '') + '_%s_%s_%s.png' % (charset.index(c), c, i)
canvas.save(save_dir + filename)
canvas = np.asarray(canvas)
canvas = cv2.cvtColor(canvas, cv2.COLOR_RGB2GRAY)
return canvas
然后使用Keras前端和Tensorflow后端,我(至少想要)创建一个ANN:
def instantiate_model():
print('COMPILING MODEL')
model = Sequential()
model.add(Dense(10000,input_shape=input_shape, activation='relu'))
model.add(Dense(1000, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=
['accuracy'])
print(model.summary())
return model
输入形状应该是什么,如何将100x100图像更改为合适的输入形状?另外,关于此人工神经网络的形状有什么建议吗?与我阅读的CNN相比,我希望它会失败。
我觉得输入形状应该是1维10,000,但是我不确定。
EDIT ========== 大卫·夏皮罗(David Shapiro)通过以下方式准备他的训练:
def prepare_datasets(samples):
random.shuffle(samples)
training_set = samples[:round(len(samples) / 10 * 9)]
training_data = [i[0] for i in training_set]
training_data = np.asarray(training_data).astype('float32')
training_data = np.expand_dims(training_data, axis=3)
training_data /= 255
training_labels = [i[1] for i in training_set]
training_labels = np.asarray(training_labels)
training_labels = np_utils.to_categorical(training_labels, num_classes)
print('TRAINING DATA SHAPE', training_data.shape)
print('TRAINING LABELS SHAPE', training_labels.shape
return training_data, training_labels
他的方法的结果是: 训练数据形状(9360、100、100、1) 训练标签形状(9360,26)
然后将其馈送到model.fit(training_data, training_labels, batch_size=batch, epochs=epoch, verbose=1)
也许可以从这里更改尺寸!我还在学习如何使用numpy,所以我不知道所有的方法...
感谢您阅读这篇长文章!