ValueError: CNN + LSTM Невозможно передать значение формы (1, 70, 70, 1) для тензора 'time_distributed_1_input: 0', который имеет форму '(4, 70, 70, 1)' - PullRequest
0 голосов
/ 05 апреля 2020

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

В пакете

batch_input_shape, если я изменился на (4,70,70,1), то моя модель умеет тренироваться

. но при создании прогнозов я снова получаю ту же ошибку, но в обратном времени.

ValueError: Невозможно передать значение формы (1, 70, 70, 1) для Tensor 'time_distributed_1_input: 0', которое имеет shape '(4, 70, 70, 1)'.

В конце концов, мой код предсказания здесь.

    X = np.load('features.npy')
    y_train = np.load('labels.npy')

    X = X/255.0

    print(X.shape[1:])
    model = Sequential()

    model.add(TimeDistributed(Conv1D(256, kernel_size=3),batch_input_shape=(1,70,70,1)))
    model.add(Activation('relu'))
    model.add(TimeDistributed(MaxPooling1D(pool_size=2)))

    model.add(TimeDistributed(Conv1D(256, 3)))
    model.add(Activation('relu'))
    model.add(TimeDistributed(MaxPooling1D(pool_size=2)))

    model.add(TimeDistributed(Conv1D(256,3)))
    model.add(Activation('relu'))
    model.add(TimeDistributed(MaxPooling1D(pool_size=2)))


    model.add(TimeDistributed(Flatten()))

    model.add(LSTM(128, input_shape=(70,70,1),stateful=True,return_sequences=True))

    model.add(LSTM(128, stateful=True))

    model.add(Dense(64))
    model.add(Dropout(0.2))

    model.add(Dense(16))
    model.add(Activation('sigmoid'))


    sgd=SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)

    model.compile(loss='sparse_categorical_crossentropy',
                  optimizer='adam',  #sgd, rmsprop
                  metrics=['accuracy'])
    class_weights = class_weight.compute_class_weight('balanced',
                                                     np.unique(y_train),
                                                     y_train)

    model.fit(X, y_train, batch_size=4, epochs=5,class_weight=class_weights)

    model.save("LSTMCNN_model_8_8_128_layer_rmsprop.h5")

МОЙ файл прогноза:

model = load_model('LSTMCNN_model_8_8_128_layer_rmsprop.h5')
for category in CATEGORIES:  # do dogs and cats
    path = os.path.join(test_data_dir, category)  # create path to dogs and cats
    class_num = CATEGORIES.index(category)
    for img in tqdm(os.listdir(path)):  # iterate over each image per dogs and cats
        img_array = cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE)  # convert to array
        new_array = cv2.resize(img_array, (70, 70))
        new_array=new_array.reshape(-1,70,70,1)
        images.append(new_array)
# stack up images list to pass for prediction
images = np.vstack(images)
classes = model.predict_classes(images)

Может кто-нибудь, пожалуйста, помогите .. как обучить мой cnn + lstm и прогнозировать значения. Если я делаю не так, скажите, пожалуйста, лучший подход

Заранее спасибо

...