Структура модели для регрессии по изображениямPython

Программы на Python
Ответить Пред. темаСлед. тема
Гость
 Структура модели для регрессии по изображениям

Сообщение Гость »


Я пытаюсь построить модель тензорного потока для анализа настольных игр, поэтому начал с более простого набора 2D-данных. Я создал 1000 изображений черных полукругов, например:


Изображение

[img]https://i .stack.imgur.com/S5Gzn.png[/img]


Я подумал, что было бы неплохо попытаться восстановить угол плоской стороны. Я обозначил эти два примера изображений как 210,474° и 147,593°.

К сожалению, результаты, которые я получаю, ужасны. Все прогнозы по тестовым данным составляют примерно 180°, что предположительно близко к среднему значению меток.

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

Я создаю модель следующим образом:

def build_and_compile_model(): число_каналов = 200 размер_ядра = 3 image_height = 64 ширина_изображения = 64 регуляризатор = регуляризаторы.l2(0,0001) модель = keras.Sequential( [layers.Conv2D(num_channels, размер_ядра, дополнение = 'тот же', активация = 'релу', input_shape = (высота_изображения, ширина_изображения, 1), Activity_regularizer = регуляризатор), Layers.Dense(64, активация = 'relu'), Layers.Dense(64, активация = 'relu'), слои.Плотность(1)]) model.compile(loss='mean_absolute_error', оптимизатор = tf.keras.optimizers.Adam (0,001)) возвратная модель Когда я пытаюсь подогнать модель, она улучшается на несколько эпох, а затем стабилизируется на высокой ошибке.


Изображение


Вот полный пример:

импортировать математические значения импортировать Shutil импортировать типизацию из даты и времени импорта даты и времени из пути импорта pathlib импортировать matplotlib.pyplot как plt импортировать numpy как np импортировать панд как pd из PIL импортировать изображение, ImageDraw импортировать тензорный поток как tf из space_tracer импортировать LivePillowImage из тензорного потока импорта кераса из слоев импорта tensorflow.python.keras, регуляризаторов защита build_and_compile_model(): число_каналов = 200 размер_ядра = 3 image_height = 64 ширина_изображения = 64 регуляризатор = регуляризаторы.l2(0,0001) модель = keras.Sequential( [layers.Conv2D(num_channels, размер_ядра, дополнение = 'тот же', активация = 'релу', input_shape = (высота_изображения, ширина_изображения, 1), Activity_regularizer = регуляризатор), Layers.Dense(64, активация = 'relu'), Layers.Dense(64, активация = 'relu'), слои.Плотность(1)]) model.compile(loss='mean_absolute_error', оптимизатор = tf.keras.optimizers.Adam (0,001)) возвратная модель защита основной(): image_folder = Путь(__file__).parent / 'circle_images' num_images = 1000 image_data, label_data = read_input_data(num_images, image_folder) # Сделайте распечатки NumPy более удобными для чтения. np.set_printoptions(точность=3, подавление=True) image_count = image_data.shape[0] image_data = image_data.reshape(image_data.shape + (1, )) train_size = math.floor(image_count * 0,8) train_dataset = image_data[:train_size, :, :] test_dataset = image_data[train_size:, :, :] train_labels = label_data[:train_size] test_labels = label_data[train_size:] test_results = {} dnn_model = build_and_compile_model() print('набор обучающих данных:', train_dataset.shape) print('обучающие метки:', train_labels.shape) начало = datetime.now() история = dnn_model.fit( поезд_данных, train_labels, валидация_сплит=0,2, подробный = 0, эпохи = 25) print('Обучен для', datetime.now() - начало) test_results['dnn_model'] = dnn_model.evaluate(test_dataset, test_labels, verbose=0) print(pd.DataFrame(test_results, index=['Средняя абсолютная ошибка [значение игры]']).T) test_predictions = dnn_model.predict(test_dataset).flatten() печать(test_labels[:10]) печать(test_predictions[:10]) plot_loss(история) def create_images(num_images: int, image_folder: Path) -> Нет: print(f'Создание изображений: {num_images}.') image_folder.mkdir() start_angles = np.random.random(num_images) начальные_углы *= 360 rng = np.random.default_rng() rng.shuffle(start_angles) для i, start_angle в перечислении (start_angles): путь_изображения = папка_изображения / f'image{i}.png' изображение = create_image (начальный_угол) image.save(путь к изображению) label_text = '\n'.join(str(start_angle) для start_angle в start_angles) (папка_изображения/'labels.csv').write_text(label_text) def create_image(start_angle: float) -> Image.Image: image = Image.new('1', (64, 64)) # Ч/Б 64x64 рисунок = ImageDraw.Draw(изображение) Drawing.rectangle((0, 0, 64, 64), fill='white') Drawing.pieslice(((0, 0), (63, 63)), -start_angle, -start_angle+180, fill='черный') вернуть изображение def read_input_data(num_images: int, image_folder: Path) -> typing.Tuple[ np.ndarray, np.ndarray]: """ Считайте входные данные из папки изображения. :returns: (изображения, метки) """ метки = [] если image_folder.exists(): с (image_folder/'labels.csv').open() как f: для строки в f: labels.append(float(line)) image_count = len(метки) если image_count != num_images: # Размер изменился, поэтому заново создайте входные данные. Shutil.rmtree(папка_изображения, ignore_errors=True) create_images(num_images, image_folder) вернуть read_input_data(num_images, image_folder) label_data = np.array(метки) images = np.zeros((image_count, 64, 64)) для i, image_path в enumerate(sorted(image_folder.glob('*.png'))): изображение = Image.open(путь_изображения) биты = np.array(изображение) изображения[i, :, :] = биты вернуть изображения, label_data защитаplot_loss(история): plt.plot(history.history['потеря'], label='потеря') plt.plot(history.history['val_loss'], label='val_loss') plt.ylim(внизу=0) plt.xlabel('Эпоха') plt.ylabel('Ошибка [угол]') plt.legend() plt.grid(Истина) plt.show() демо-версия(): изображение = create_image(226.634) LivePillowImage(изображение).display() если __name__ == '__main__': основной() elif __name__ == '__live_coding__': демо() В конце я вижу такой результат:

Обучен на 0:00:09.155005 Средняя абсолютная ошибка [игровая ценность] dnn_model 92.051697 7/7 [=============================] - 0 с 4 мс/шаг [210,474 147,593 327,796 120,112 163,402 178,04 333,604 342,488 119,694 240,8 ] [177,15 181,242 181,242 181,242 181,242 181,242 181,242 181,242 181,242 181,242] Вы можете видеть, что все прогнозы близки к 180°.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»