#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) несовместимы «