如何建立数据库以学习喀拉拉邦的网络?

时间:2018-10-11 19:32:47

标签: python tensorflow keras

我有一些图像受到了JPEG,盐和胡椒等不同类型的攻击,...现在,我想设计一个网络,这些图像及其标签被添加到网络中,并说明什么类型的攻击是完成。但是我不知道如何建立数据库并准备训练数据?您能帮我解决这个问题吗?提前致谢。     我使用了下面的代码,但是会产生以下错误,并且我不知道该如何解决该问题。请指导我有关此问题。 我添加了此代码,但是在实现它时会产生以下错误:ValueError:检查输入时出错:预期conv2d_37_input具有形状(512,512,1)但得到形状为(512,512,3)的数组     将numpy导入为np     导入matplotlib.pyplot作为plt     从keras.preprocessing.image导入ImageDataGenerator     从sklearn.utils导入shuffle     从sklearn.cross_validation导入train_test_split     进口喀拉拉邦     从keras导入后端为K     #K.set_image_dim_ordering('th')

from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.optimizers import SGD,RMSprop,adam

model = Sequential()
model.add(Conv2D(32, (3,3),border_mode='same', input_shape = (512, 512, 1), activation = 'relu'))
model.add(Activation('relu'))
model.add(Conv2D(32, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))

model.add(Conv2D(64, 3, 3))
model.add(Activation('relu'))

model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))

model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(7))
model.add(Activation('softmax'))

model.summary()

model.compile(loss = 'categorical_crossentropy',
              optimizer = 'rmsprop',
              metrics = ['accuracy'])
train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
        r'E:\PhD\thesis\deepwatermark\databasetest\train',
        target_size=(512, 512),
        batch_size=32,
        class_mode='binary')
validation_generator = test_datagen.flow_from_directory(
        r'E:\PhD\thesis\deepwatermark\databasetest\validation',
        target_size=(512, 512),
        batch_size=32,
        class_mode='binary')
model.fit_generator(
        train_generator,
        steps_per_epoch=20,
        epochs=50,
        validation_data=validation_generator,
        validation_steps=8)

2 个答案:

答案 0 :(得分:1)

有多种处理数据集的方法,在keras中,您可以使用numpy数组或生成器为网络提供数据。

有关生成器的详细文档:

https://keras.io/preprocessing/image/#imagedatagenerator-class https://keras.io/preprocessing/image/#imagedatagenerator-methods

如果要使用生成器,则在执行任何操作之前,请按其标签将图像分隔到不同的目录中。文件层次结构应该看起来像

  • TrainingData
    • 标签1
      • image1.jpg
      • image2.jpg
    • Label2
      • image1.jpg
      • image2.jpg

如果要将所有数据存储到numpy数组中,建议将所有数据放入csv文件中,并且其标签应位于第一列或最后一列。对于大型数据集,我不建议这样做,因为您可能没有足够的内存来存储所有数据。

样本:     型号=     #为火车创建预处理器(将0-255 rgb值映射为0-1,随机缩放,     剪切和翻转以人为地增加数据大小)     train_datagen = ImageDataGenerator(     重新缩放= 1. / 255,     shear_range = 0.2,     zoom_range = 0.2,     horizo​​ntal_flip = True)

#Create validation preprocessor(map 0-255 rgb values to 0-1)
validation_datagen = ImageDataGenerator(rescale=1./255)

#Create train generator
train_generator = train_datagen.flow_from_directory(
    'data/train',
    target_size=(150, 150),
    batch_size=32,
    class_mode='categorical')
#Create validation generator
validation_generator = 
    validation_datagen.flow_from_directory('data/validation',
    target_size=(150, 150),
    batch_size=32,
    class_mode='categorical')
#fit your model using the data from generators.
model.fit_generator(
    train_generator,
    steps_per_epoch=2000,
    epochs=50,
    validation_data=validation_generator,
    validation_steps=800)

答案 1 :(得分:1)

我建议使用生成器,因为它们易于编写并且可以安全地运行您的代码。至于组织数据,来自@Mete的答案是可以的,但也可以考虑使用一列中的图像名称以及另一列中的攻击类型来制作csv。然后,您只需逐行浏览csv文件,然后执行所需的任何操作即可。