Ошибка измерения при подаче 3D-тензора в сети CNN и keras

#python #tensorflow #machine-learning #keras #deep-learning

#python #тензорный поток #машинное обучение #keras #глубокое обучение

Вопрос:

Мой Xtrain представляет собой изображение RGB размера (numofsamples, height, width, channel). Где numofsamples = 1047, высота = 128, ширина = 128, каналы = 3.

Это делается путем выполнения приведенных ниже кодов:

 for img_filename in train_files:
    img = image.load_img(os.path.join(rootdir,'train_image/train_image',img_filename), target_size=(128,128,1))
    img = image.img_to_array(img)
    img = img/255
    train_image.append(img)
X_train = np.array(train_image)
  

Я пытаюсь запустить модель CNN LSTM для данных с увеличением изображения. Но я продолжаю получать ошибки разных измерений.

  1. Если бы я должен был запустить этот код:
 batch_size = 64
model.add(TimeDistributed(Conv2D(64, kernel_size=(3, 3),activation='relu',input_shape = (128,128,3))))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Flatten()))
model.add(LSTM(512, return_sequences=False, dropout=0.1))
model.add(Flatten())
model.add(Dense(256))
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy'])
model.fit_generator(train_generator.flow(Xtrain,ytrain,batch_size=batch_size),
                        #steps_per_epoch = Xtrain.shape[0] // batch_size,
                        epochs = 50,
                        verbose = True,
                        validation_data= (Xval,yval),
                        callbacks = [reduce_lr,es,ModelCheckpoint('cnnlstm' '_weights.hdf5', monitor='val_accuracy', verbose=1, save_best_only=True, mode='max')]
                       )
  

Моя ошибка, с которой я столкнулся,:

InvalidArgumentError: входные данные должны быть 4-мерными [8192,128,3] [Op: Conv2D]

Если бы я изменил его на (1047, 128, 128, 3, 1), Я получу ошибку numpy.

 Xtrain_reshape = np.expand_dims(Xtrain, -1)
Xval_reshape = np.expand_dims(Xval, -1)

model = Sequential()
# define CNN model
model.add(TimeDistributed(Conv2D(64, kernel_size=(3, 3),activation='relu',input_shape = (128,128,3))))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Flatten()))
# define LSTM model
model.add(LSTM(512, return_sequences=False, dropout=0.1))
model.add(Flatten())
model.add(Dense(256))
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy'])
model.fit_generator(train_generator.flow(Xtrain_reshape,ytrain,batch_size=batch_size),
                        #steps_per_epoch = Xtrain.shape[0] // batch_size,
                        epochs = 50,
                        verbose = True,
                        validation_data= (Xval_reshape,yval),
                        callbacks = [reduce_lr,es,ModelCheckpoint('cnnlstm' '_weights.hdf5', monitor='val_accuracy', verbose=1, save_best_only=True, mode='max')]
                       )
  

Моя ошибка здесь

Ошибка ValueError: (‘Входные данные NumpyArrayIterator должны иметь ранг 4. Вы передали массив с формой’, (1047, 128, 128, 3, 1))

Можете ли вы сообщить мне, как изменить его, чтобы я мог пройти через CNN и LSTM?

Комментарии:

1. укажите код, в котором вы готовите свои данные. В вашей исходной ошибке указано, что форма ваших входных данных (8192,128,3)

2. @mb0850 Размер моего пакета равен 64. итак, я предполагаю, что его размер пакета * высота изображения = 64 * 128

3. Этого не должно быть, если размер вашего пакета равен 64, то форма ввода должна быть (64, 128, 128, 3) . Вам нужно указать код, который вы используете, для генерации ваших данных обучения / тестирования, чтобы мы могли понять, в чем проблема.

4. Я загружаю его из своего каталога и выполняю только приведенные выше коды для генерации данных поезда

5. Похоже, что в предоставленном вами коде все еще существует разрыв между model.fit_generator(train_generator.flow(Xtrain,ytrain,batch_size=batch_size) и X_train тем, что вы создаете.