Я пытаюсь обучить простую модель некоторым данным изображения, принадлежащим 10 классам. Изображения представлены в черно-белом формате (не в оттенках серого), я использую image_dataset_from_directory для импорта данных в python, а также для разделения их на наборы проверки/обучения. Мой код выглядит следующим образом:
Мой импорт
import matplotlib.pyplot as plt
import numpy as np
import os
import PIL
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.layers import Dense
Чтение данных изображения
trainDT = tf.keras.preprocessing.image_dataset_from_directory(
data_path,
labels = "inferred",
label_mode = "categorical",
class_names=['0','1','2','3','4','5','6','7','8','9'],
color_mode = "grayscale",
batch_size=4,
image_size=(256, 256),
shuffle=True,
seed=44,
validation_split=0.1,
subset='validation',
interpolation = "bilinear",
follow_links=False,
)
Создание модели/компиляция/подгонка
model = Sequential([
Dense(units=128, activation='relu', input_shape=(256,256,1), name='h1'),
Dense(units=64, activation='relu',name='h2'),
Dense(units=16, activation='relu',name='h3'),
layers.Flatten(name='flat'),
Dense(units=10, activation='softmax',name='out')
],name='1st')
model.summary()
model.compile(optimizer='adam' , loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x=trainDT, validation_data=train_data, epochs=10, verbose=2)
Обучение модели возвращает ошибку:
InvalidArgumentError Traceback (most recent call last)
....
/// anaconda paths and anaconda python code snippets in the error reporting \\\
....
InvalidArgumentError: Matrix size-incompatible: In[0]: [1310720,3], In[1]: [1,128]
[[node 1st/h1/Tensordot/MatMul (defined at <ipython-input-38-58d6507e2d35>:1) ]] [Op:__inference_test_function_11541]
Function call stack:
test_function
Я не понимаю, откуда взялось несоответствие размеров, я провел несколько часов в поисках решения и пробовал разные вещи, но, похоже, у меня ничего не работает. Рад любой помощи, заранее спасибо!






Hy mhk777 Надеюсь, у тебя все хорошо. Брат, я думаю, что ты путаешь плотные слои со слоями свертки. Вы должны применить к изображению несколько слоев свертки, прежде чем накладывать его на плотные слои. Если вы не хотите применять свертку, вам нужно передать 2d-массив плотному слою, т.е. (количество выборок, данные)
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
model = models.Sequential()
# Here are convolutional Layer
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(256,256,1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
# Here are your dense layers
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10))
model.summary()
model.compile(optimizer='adam' , loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x=trainDT, validation_data=train_data, epochs=10, verbose=2)
Хорошо, @matus только что решил твою проблему, удачи
не могли бы вы помочь мне в этом, пожалуйста stackoverflow.com/questions/68225332/matrix-size-incompatible ?
Dense слои ожидают плоский вход (не 3d-тензор), но вы отправляете (256,256,1) фигурный тензор в первый плотный слой. Если вы хотите использовать плотные слои с самого начала, вам нужно будет переместить плоскость на первый слой или вам нужно будет правильно изменить форму ваших данных.
model = tf.keras.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation = "relu"),
tf.keras.layers.Dense(10, activation = "softmax")
])
Кроме того, сглаживание между двумя плотными слоями не имеет смысла, потому что выход плотного слоя в любом случае плоский.
Исходя из структуры вашей модели (особенно плоского размещения), я предполагаю, что вместо этого эти плотные слои должны были быть сверточными слоями.
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), activation='relu'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation = "relu"),
tf.keras.layers.Dense(10, activation = "softmax")
])
Сверточные слои могут обрабатывать двумерные входные данные, а также они будут создавать более объемный вывод, который необходимо сгладить перед передачей в плотную вершину (обратите внимание, что вы можете добавить больше сверточных слоев).
Спасибо, Матус, я думаю, что теперь я понимаю проблему, ценю ваш ответ .. Еще раз спасибо!
Кстати, есть ли способ уменьшить вычислительную нагрузку, если данные на изображениях только черно-белые, то есть каждый пиксель равен либо 1, либо 0?
Кроме использования одного входного канала вместо трех (RGB), которые вы уже делаете, я не знаю ни одной техники, которая была бы специально ориентирована на черно-белые изображения.
Спасибо @Matus .. Я вижу еще одну ошибку: «UnimplementedError Traceback (последний последний вызов) UnimplementedError: реализация Fused conv пока не поддерживает сгруппированные свертки. [[узел 1st/h1/Relu (определено в <ipython-input-28-58d6507e2d35>:1)]] [Op:__inference_test_function_8286] Стек вызовов функций: test_function ' есть идеи, как я могу справиться с этим?
Невозможно сказать, не видя весь код и место, где возникает ошибка. Если вы застряли с этой ошибкой, я предлагаю вам задать новый вопрос с точным кодом и полным описанием проблемы, с которой вы столкнулись прямо сейчас. Вы можете добавить URL к этому вопросу здесь, в комментариях.
Большое спасибо, Сохаиб, у меня все хорошо, надеюсь, вы тоже в добром здравии :) Я не поддерживаю использование слоев свертки, поскольку мои данные в значительной степени бинарны.