batch_size = x.shape [0] AttributeError:' tuple'对象没有属性'形状'

时间:2017-09-17 23:04:18

标签: python machine-learning deep-learning keras

此代码将图像和遮罩组合在一起进行图像检测? 我该如何纠正这个错误?

  

batch_size = x.shape [0] AttributeError:' tuple'对象没有属性'形状'

这是用于培训的代码:

train_datagen = ImageDataGenerator(
            rescale=1. / 255,
            shear_range=0.2,
            zoom_range=0.2,
            horizontal_flip=True)
train_datagen_1 = ImageDataGenerator(
            rescale=1. / 255,
            shear_range=0.2,
            zoom_range=0.2,
            horizontal_flip=True)


train_generator = train_datagen.flow_from_directory(
            train_data_dir,
            target_size=(200, 150),
            batch_size=1
          )
train_generator_1= train_datagen_1.flow_from_directory(
            train_data_dir_1,
            target_size=(200, 150),
            batch_size=1)
train_generator_2 = zip( train_generator, train_generator_1)

model.fit_generator(
            train_generator_2,
            steps_per_epoch=nb_train_samples // batch_size,
            epochs=50)

这是我使用的模型:

model = Sequential() 
model.add(Conv2D(32, (3, 3), input_shape=(200, 150, 3))) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Flatten()) 
model.add(Dense(20)) model.add(Activation('relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(90000)) 
model.add(Activation('sigmoid')) 
model.compile(loss='mse', optimizer='rmsprop', metrics=['accuracy'])

3 个答案:

答案 0 :(得分:4)

因此,由于您的模型只有一个输出,因此您无法加入这样的两个生成器。

  • 生成器必须在元组中输出(input,output)之类的内容。
  • 你的正在输出((input1,output1), (input2,output2))元组内的元组。

当您的模型从生成器获取批处理时,它会尝试获得它认为input的形状,但它会找到(input,output)

使用生成器:

您可以像这样创建自己的生成器:

def myGenerator(train_generator,train_generator1):

    while True:

        xy = train_generator.next() #or next(train_generator)
        xy1 = train_generator1.next() #or next(train_generator1)
        yield (xy[0],xy1[0])

使用以下方式实例化:

train_generator2 = myGenerator(train_generator,train_generator1)

现在,您将遇到输出形状的真正问题。如果您正在从图像到图像工作,我建议您使用纯粹的卷积模型。

卷积层输出(Batch, Side1, Side2, channels),这是您在图像中使用的形状。

但是密集层输出(Batch, size)。这只有在您稍后使用Reshape((200,150,3))重新整形以匹配您的"真实图像"时才有效。

提示:模型中间的密集20可能太少而无法表示整个图像。 (但当然这取决于你的任务)。

此任务的可能模型是:

Conv
... Maybe more convs
MaxPooling
Conv
... Maybe more convs
MaxPooling
Conv

......

UpSampling
Conv
...
UpSampling
Conv
....

padding='same'的每个卷积使您的生活更轻松。 (但由于你有一个维度为150,你必须在某个时刻管理填充值,因为当你达到75时,MaxPooling将删除/添加一个像素(75不能除以2)。

答案 1 :(得分:1)

class_mode=None添加flow_from_directory()可以解决此问题:

 from keras.preprocessing.image import ImageDataGenerator

 train_datagen = ImageDataGenerator(
      rescale=1./255,
      shear_range=0.2,
      zoom_range=0.2,
      horizontal_flip=True)

 train_image_generator = train_datagen.flow_from_directory('path/to/data',
      target_size=(256, 256), 
      class_mode=None, 
      batch_size=4) 

答案 2 :(得分:0)

所选答案不准确。代码失败的原因不是因为元组属于((input1,output1), (input2,output2)), ...),而是因为它们属于(((input1, class1), (input2, class2), ...), ((output1, class1), (output2, class2), ...))类型。

您可以通过向class_mode=None来电添加flow_from_directory来解决问题。