【问题标题】:image input to neural networks神经网络的图像输入
【发布时间】:2018-03-22 07:03:40
【问题描述】:

我正在从扫描的文档中提取图形。使用 1100x850 图像。我们使用 44x34 的图像网格。这样最后一层将是 1496 全连接层。 标签是 44x34 BINARY 数组,其中 1 表示图形区域,0 表示非图形区域。即如果图形落在(右上)(x,y)=(0,0)(左下)(x,y)=(50,50),那么bin数组在(0,0)处有1(0,1 ) 和 (1,0) (1,1) 这些位置和其余 0。所以我有一个神经网络模型。以下是结构。

conv(5,2,48)
maxpool(3,2)
conv(5,2,96)
maxpool(3,2)
conv(5,2,96)
maxpool(3,2)
FC-1496

符号 conv(k,d, n) 表示具有 n 个过滤器的卷积层,每个过滤器的大小为 k × k,应用 d 个像素的移位; maxpool(k, d) 表示在 k×k 个窗口上的下采样操作,应用了 d 个像素的移位。 FC-1496 指最终全连接 层将前一层的隐藏单元连接到 1496 个输出单元(对于 44x34 网格,我们有 1496 个单元)。

所以我的问题是如何使用 keras 和张量流向该模型提供输入(图像和标签(数组))。

这是型号代码

from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers.core import Activation
from keras.layers.core import Dense
from keras.models import Sequential
from keras.layers import Flatten


xtrain=#image of 850*1100 for 10 images 10 850*1100
xtest=#binary array of size 1496 for 10 images size is 10*1496

# initialize the model
model = Sequential()
model.add(Conv2D(48, 5, 2, input_shape=(1100, 850, 1)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=2))

model.add(Conv2D(96, 5, 2))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=2))

model.add(Conv2D(96, 5, 2))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=2))
model.add(Flatten())
model.add(Dense(1496, activation='sigmoid'))

model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['accuracy'])

【问题讨论】:

  • 你写了什么代码?您是否已经尝试过使用 Keras?
  • 我只为模型编写代码而不是训练或测试,所以我想知道如何将图像作为上述模型的输入。如果需要,我可以发布模型代码。
  • 您需要提供一些代码,否则问题无法回答。

标签: python neural-network keras


【解决方案1】:

这是一个基于您的数据的工作示例(我从您的信息中假设)

我将标签用作 1 和 0 的向量,例如 [1,0,1,1,...] 1 表示图形区域,0 表示无图形区域,总共 1496 个区域

from __future__ import print_function
import numpy as np
np.random.seed(1337)  # for reproducibility

from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Activation, Flatten
from keras.utils import np_utils

batch_size = 128
nb_epoch = 10
nb_regions = 1496

# input image dimensions
img_rows, img_cols = 850, 1100

# create random test and train sets
X_train = np.random.randint(256, size=(10, img_rows, img_cols))
Y_train = np.random.randint(2, size=(10, nb_regions))

X_test = np.random.randint(256, size=(10, img_rows, img_cols))
Y_test = np.random.randint(2, size=(10, nb_regions))


X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)
X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255

model = Sequential([
    Dense(32, input_shape=(1, img_rows, img_cols)),
    Activation('relu'),
    Flatten(),
    Dense(nb_regions),
    Activation('softmax'),
])

model.compile(loss='categorical_crossentropy',
              optimizer='adadelta',
              metrics=['accuracy'])

model.fit(X_train, Y_train, batch_size=batch_size, epochs=nb_epoch,
          verbose=1, validation_data=(X_test, Y_test))

score = model.evaluate(X_test, Y_test, verbose=0)

print('Test score:', score[0])
print('Test accuracy:', score[1])

【讨论】:

  • 感谢您的回复,但在我们的例子中,类的数量是 2,要么是它的图(1),要么是非图(0),并且也符合 (x_train,y_train),(x_test,y_test) =mnsit.load_data() 我们希望我们的数据加载是图像输入,标签为 npy 数组
  • 这只是一个例子,你应该根据自己的情况进行调整,如果你能提供一些数据,我也许可以帮助你......
  • 我的输入是 850*1100 像素的灰度图像,所以如果我有 10 张图像,它会列出十个 850*1100 np 数组
  • 根据您关于该问题的新信息更改了我的答案
  • 感谢您的回复,但您将整个图像分类为 0 或 1。但在我的模型中,我的最后一层有 1496 个过滤器,这意味着我想要我的 (44*34=1496) 区域要分类为 0 或 1 的图像。 y_test 和 y_train 数据由每个图像的 1496 个 0 和 1 值组成。因此,我关心将图像的一部分(每个部分 25*25,总共 1496 个部分)分类为 0 或 1。请尽快提供帮助;提前致谢
猜你喜欢
  • 1970-01-01
  • 2015-06-24
  • 2011-01-06
  • 2012-10-05
  • 2017-09-16
  • 1970-01-01
  • 2019-05-15
  • 2013-06-30
相关资源
最近更新 更多