Ошибка значения: Ввод 0 слоя sequential_1 несовместим со слоем: : ожидаемый min_ndim=4, найденный ndim=2. Полная форма получена: (32768, 1)

#python #pandas #tensorflow #machine-learning #keras

Вопрос:

 import keras
from keras.models import Sequential
from keras.applications.vgg16 import VGG16
from keras.layers import Dense, InputLayer, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D, GlobalMaxPooling2D
from keras.preprocessing import image
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from tqdm import tqdm
from sklearn.model_selection import train_test_split
y = train['class']
images_train, images_test, y_train, y_test = train_test_split(images, y, random_state=42, 
test_size=0.2, stratify = y)

y_train = pd.get_dummies(y_train)
y_test = pd.get_dummies(y_test)

base_model = VGG16(weights='imagenet', include_top=False)

images_train = base_model.predict(images_train)
images_train.shape

images_test = base_model.predict(images_test)
images_test.shape

images_train = images_train.reshape(2321, 8*8*512)
images_test = images_test.reshape(581, 8*8*512)
max = images_train.max()
images_train = images_train/max
images_test = images_test/max

images_train.shape

model=Sequential()

model.add(Conv2D(input_shape=(10, 8, 8, 512),filters=4,kernel_size= 
(3,3),padding="same",activation="relu"))
model.add(Conv2D(filters=64,kernel_size=(3,3),padding="same",activation="relu"))

model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4, activation='softmax'))

from keras.callbacks import ModelCheckpoint
mcp_save = ModelCheckpoint('weight.hdf5', save_best_only=True, monitor='val_loss', mode='min')

model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy'])
import tensorflow as tf
train_data = tf.data.Dataset.from_tensor_slices((images_train, y_train))
valid_data = tf.data.Dataset.from_tensor_slices((images_test, y_test))
model.fit(train_data, epochs=40, validation_data=valid_data, callbacks=[mcp_save], 
batch_size=10)


      
 

ошибка:

Я создал набор данных, состоящий из четырех различных действий, которые

  1. сморкаясь
  2. падающий
  3. боль в груди
  4. из трех просмотров слева ,справа и спереди получается в общей сложности 180 видео. Затем я извлек кадры из каждого видео с упражнениями, так что у меня всего 2902 кадра. Я пытаюсь ввести эти кадры в модель CNN . Я получаю ошибку, как показано выше, как ученик, я не могу решить эту ошибку. Пожалуйста, помогите мне решить эту ошибку .

Ответ №1:

Я не могу прочитать так много из вашего кода, но ваша форма ввода неверна для сети. Вы пытаетесь ввести images_train в свою сеть VGG. Сеть VGG нуждается в качестве входных данных в четырехмерном массиве numpy. Это имеет форму (размер пакета, каналы, ширина, высота) или (размер пакета, ширина, высота, каналы), в зависимости от того, выбрали ли вы формат данных «channels_last» или «channels_first» (я точно не знаю, где это установить, но, тем не менее, один из них должен работать).

Ваш ввод в вашу сеть не имеет такой формы, вот почему вы получаете сообщение об ошибке. Попробуйте запустить np.shape(images_train), тогда вы сможете увидеть форму вашего ввода. Если это не четырехмерно, то ваш ввод неверно сформирован для VGG net.