Ошибка значения: формы () и (150, 5) несовместимы Tenosrflow

#python #numpy #tensorflow #machine-learning #keras

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

Вопрос:

Итак, я обучаю модель классификации изображений, и появляется эта ошибка. Похоже, на эту ошибку нет ответа. Может кто-нибудь, пожалуйста, объясните мне, что не так с моим кодом. Я использую tf.data. Есть ли какие-либо проблемы с метками.Что я могу сделать, чтобы решить эту проблему:

 import numpy as np
import pandas as pd
import os
from tqdm import tqdm
from sklearn.utils import shuffle

import cv2
import warnings

warnings.filterwarnings('ignore')

import tensorflow as tf
from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import Dense, Flatten, Dropout, Activation, Conv1D, MaxPool1D

from tensorflow.keras.layers import Dense, Dropout, Activation, Input, BatchNormalization, GlobalAveragePooling2D

physical_devices = tf.config.list_physical_devices('GPU')
tf.config.experimental.set_memory_growth(physical_devices[0], True)
training_folder = r"F:Pycharm_projectsKaggle Cassavadatatrain_images"
samples_df = pd.read_csv(r"F:Pycharm_projectsKaggle Cassavadatatrain.csv")
samples_df = shuffle(samples_df, random_state=42)
samples_df["label"] = samples_df["label"].astype("str")
samples_df.head()
temp_labels = {}
imgg = []
lab = []
for i in range(len(samples_df)):
    image_name = samples_df.iloc[i, 0]
    image_label = samples_df.iloc[i, 1]
    la = {image_name: image_label}
    temp_labels.update(la)
print(len(temp_labels))
for im in tqdm(os.listdir(training_folder)):
    path = os.path.join(training_folder, im)
    label = temp_labels.get(im)
    img = cv2.imread(path)
    img = tf.image.random_crop(img, size=(150, 150, 3))
    imgg.append(img)
    lab.append(label)

lables = np.array(lab).astype(np.float32)
img = np.array(imgg).astype(np.float32)
train = tf.data.Dataset.from_tensor_slices((img, lables)).shuffle(buffer_size=1000)
print(tf.data.Dataset.cardinality(train))
model = Sequential()
model.add(Conv1D(filters=16, kernel_size=2, strides=1, activation="relu"))
model.add(BatchNormalization())

model.add(Conv1D(filters=16, kernel_size=2, strides=1, activation="relu"))
model.add(BatchNormalization())

model.add(BatchNormalization())

model.add(Flatten())
model.add(Dense(5, activation="sigmoid"))

tf.keras.optimizers.Adam(
    learning_rate=0.0001, )
model.compile(optimizer='adam',
              loss="categorical_crossentropy"
              ,
              metrics=['accuracy'])
model.fit(train, batch_size=32, shuffle=True, epochs=1)

 

Что я могу сделать, чтобы устранить эту ошибку.

Ответ №1:

Во-первых, если вы загружаете изображения, вы должны использовать Conv2D вместо Conv1D . (см. Документ)

Затем добавьте это :

 model.add(tf.keras.layers.Input(shape=(150,150,3)))
 

между этими двумя слоями :

 model = Sequential()

model.add(tf.keras.layers.Input(shape=(150,50)))

model.add(Conv2D(filters=16, kernel_size=2, strides=(1,1), activation="relu"))
 

Также измените model.fit

 model.fit(images,labels, batch_size=32, shuffle=True, epochs=1)

 

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

1. я получаю это ошибка значения: ввод 0 слоя conv1d_4 несовместим со слоем : : ожидаемый min_ndim=3, найденный ndim = 2. Получена полная форма: (Нет, 5)

2. Я не знаю, что вы передаете в свою сеть, какова форма ваших изображений?

3. 150,150,3 см. Это img = tf.image.random_crop(img, size=(150, 150, 3))

4. получение этого значения ошибки: ввод 0 слоя conv2d несовместим со слоем : : ожидаемый min_ndim=4, найденный ndim= 3. Получена полная форма: (Нет, 150, 150). Должен ли я что-то добавить к размеру изображения

5. попробуйте эту модель.fit(img, lables, batch_size=32, shuffle= True, эпохи = 1)

Ответ №2:

сначала измените функцию активации последнего слоя. активация «сигмоида», используемая для двоичной классификации. Кажется, у вас 5 классов, а не 2. поэтому измените «sigmoid» на «softmax» и повторите попытку.

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

1. все еще получаю сообщение `Ошибка значения: формы () и (150, 5) несовместимы «