keras:更改Image对象的尺寸以馈入ANN?

时间:2018-09-15 18:58:09

标签: python tensorflow neural-network keras

我正在尝试学习神经网络! 我正在尝试在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,所以我不知道所有的方法... 感谢您阅读这篇长文章!

0 个答案:

没有答案