Я пытаюсь обучить многооборотную классификационную модель с керами. Приложение будет в промышленной обстановке для классификации дефектных изображений, обычно захваченных во время производства. Ожидаемым выводом будет правильно идентифицировать дефект «A» или дефект «B». Однако, возможно, и дефект «A», и «B» могут возникнуть вместе, отсюда и необходимость в многоуровневой классификации. (В действительности будет более 10 различных классификаций дефектов, и теоретически можно найти несколько дефектов, если маловероятно.) Все идет нормально. Теперь мне нужна модель, которая также может идентифицировать «A» и «B». У меня намеренно нет тренировочных изображений как с треугольниками, так и с квадратами, так как я хочу повторить обучение изображения дефекта, где у меня не будет достаточного количества изображений с несколькими дефектами. Интуитивно, кажется, это не должно иметь значения. Все, что должна сделать модель, это сказать мне, думает ли она, что есть квадрат на изображении, независимо от того, есть ли также треугольник. Я чувствую, что мне не хватает чего-то более высокого уровня, а не просто настраивать, например, параметры моей модели. Модель неправильно идентифицирует тестовые изображения как с квадратами, так и с треугольниками, хотя она хорошо работает, когда есть один или другой. I followed the various online guides to be sure the model has:
sigmoid final activation
binary_crossentropy loss
Adam optimizer
onehot multilabels produced with MultiLabelBinarizer()
Я использую следующие версии модуля в системе Linux Mint 22.1: < /p>
. Для обучения, поскольку это будет отражать приложение к дефектным изображениям, которые также являются серого. Бонус, что он сохраняет при использовании памяти. < /Li>
< /ul>
Code с посторонними комментариями, удаленными < /p>
from PIL import ImageDraw, Image
import numpy as np
# SmallerVGGNet modules
import pandas as pd
from keras.models import Sequential
from keras.layers import BatchNormalization
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Activation
from keras.layers import Flatten
from keras.layers import Dropout
from keras.layers import Dense
from keras import backend as K
# training modules
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from keras.optimizers import Adam
from keras.preprocessing.image import img_to_array
from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.model_selection import train_test_split
#from pyimagesearch.smallervggnet import SmallerVGGNet
import matplotlib.pyplot as plt
from imutils import paths
import tensorflow as tf
import numpy as np
import argparse
import random
import pickle
import cv2
import os
tf.compat.v1.enable_eager_execution() # enable eager execution
class SmallerVGGNet:
@staticmethod
def build(width, height, depth, classes, finalAct="softmax"):
model = Sequential()
inputShape = (height, width, depth)
chanDim = -1
if K.image_data_format() == "channels_first":
inputShape = (depth, height, width)
chanDim = 1
model.add(Conv2D(64, (2, 2), padding="same", input_shape=inputShape))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (2, 2), padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, (2, 2), padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, (2, 2), padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
# first (and only) set of FC => RELU layers
model.add(Flatten())
model.add(Dense(256))
model.add(Activation("relu"))
#model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(classes))
model.add(Activation(finalAct))
return model
# initialize the number of epochs to train for, initial learning rate, batch size, and image dimensions
EPOCHS = 50
BS = 32
IMAGE_DIMS = (200, 200, 1) # 1 channel for grayscale
# initialize the data and labels
data = []
labels = []
print("[INFO] loading images...")
for item in ['squares','triangles']:
image_path = f"Train/{item}"
imagePaths = sorted(list(paths.list_images(image_path)))
for imagePath in imagePaths:
# load the image, pre-process it, and store it in the data list
image = cv2.imread(imagePath, 0) # 0 reads as grayscale
image = img_to_array(image)
data.append(image)
labels.append([item])
# scale the raw pixel intensities to the range [0, 1]
data = np.array(data, dtype="float") / 255.0
labels = np.array(labels)
print("[INFO] data matrix: {} images ({:.2f}MB)".format(len(data), data.nbytes / (1024 * 1000.0)))
# binarize the labels using scikit-learn's special multi-label binarizer implementation
print("[INFO] class labels:")
mlb = MultiLabelBinarizer()
labels = mlb.fit_transform(labels)
# loop over each of the possible class labels and show them
for (i, label) in enumerate(mlb.classes_):
print("{}. {}".format(i + 1, label))
# partition the data into training and testing splits using 80% of the data for training and the remaining 20% for testing
(trainX, testX, trainY, testY) = train_test_split(data, labels, test_size=0.2, random_state=42)
# construct the image generator for data augmentation
aug = ImageDataGenerator(rotation_range=25, width_shift_range=0.1,
height_shift_range=0.1, shear_range=0.2, zoom_range=0.2,
horizontal_flip=True, fill_mode="nearest")
print("[INFO] compiling model...")
model = SmallerVGGNet.build(width=IMAGE_DIMS[1], height=IMAGE_DIMS[0],
depth=IMAGE_DIMS[2], classes=len(mlb.classes_), finalAct="sigmoid")
model.compile(loss="binary_crossentropy", optimizer=Adam(), metrics=["accuracy"])
# train the network
print("[INFO] training network...")
H = model.fit(
x=aug.flow(trainX, trainY, batch_size=BS),
validation_data=(testX, testY),
steps_per_epoch=len(trainX) // BS,
epochs=EPOCHS, verbose=1)
model.save("model_multilabel_gray.keras")
with open('history_gray.pkl', 'wb') as file:
pickle.dump(H.history, file)
with open('classes.pkl', 'wb') as file:
pickle.dump(mlb.classes_, file)
Я попытался изменить различные параметры в модели, но полученная модель находит только одну из форм в изображении (только треугольник, но не квадрат, когда обе формы присутствуют.)
Я пытаюсь обучить многооборотную классификационную модель с керами. Приложение будет в промышленной обстановке для классификации дефектных изображений, обычно захваченных во время производства. Ожидаемым выводом будет правильно идентифицировать дефект «A» или дефект «B». Однако, возможно, и дефект «A», и «B» могут возникнуть вместе, отсюда и необходимость в многоуровневой классификации. (В действительности будет более 10 различных классификаций дефектов, и теоретически можно найти несколько дефектов, если маловероятно.) Все идет нормально. Теперь мне нужна модель, которая также может идентифицировать «A» и «B». У меня намеренно нет тренировочных изображений как с треугольниками, так и с квадратами, так как я хочу повторить обучение изображения дефекта, где у меня не будет достаточного количества изображений с несколькими дефектами. Интуитивно, кажется, это не должно иметь значения. Все, что должна сделать модель, это сказать мне, думает ли она, что есть квадрат на изображении, независимо от того, есть ли также треугольник. Я чувствую, что мне не хватает чего-то более высокого уровня, а не просто настраивать, например, параметры моей модели. Модель неправильно идентифицирует тестовые изображения как с квадратами, так и с треугольниками, хотя она хорошо работает, когда есть один или другой. I followed the various online guides to be sure the model has: [list] [*]sigmoid final activation [*]binary_crossentropy loss [*]Adam optimizer [*]onehot multilabels produced with MultiLabelBinarizer() [/list] Я использую следующие версии модуля в системе Linux Mint 22.1: < /p>
. Для обучения, поскольку это будет отражать приложение к дефектным изображениям, которые также являются серого. Бонус, что он сохраняет при использовании памяти. < /Li> < /ul>
Code с посторонними комментариями, удаленными < /p>
[code]from PIL import ImageDraw, Image import numpy as np
# SmallerVGGNet modules import pandas as pd from keras.models import Sequential from keras.layers import BatchNormalization from keras.layers import Conv2D from keras.layers import MaxPooling2D from keras.layers import Activation from keras.layers import Flatten from keras.layers import Dropout from keras.layers import Dense from keras import backend as K
# training modules from tensorflow.keras.preprocessing.image import ImageDataGenerator from keras.optimizers import Adam from keras.preprocessing.image import img_to_array from sklearn.preprocessing import MultiLabelBinarizer from sklearn.model_selection import train_test_split #from pyimagesearch.smallervggnet import SmallerVGGNet import matplotlib.pyplot as plt from imutils import paths import tensorflow as tf import numpy as np import argparse import random import pickle import cv2 import os
# first (and only) set of FC => RELU layers model.add(Flatten()) model.add(Dense(256)) model.add(Activation("relu")) #model.add(BatchNormalization()) model.add(Dropout(0.5)) model.add(Dense(classes)) model.add(Activation(finalAct)) return model
# initialize the number of epochs to train for, initial learning rate, batch size, and image dimensions EPOCHS = 50 BS = 32 IMAGE_DIMS = (200, 200, 1) # 1 channel for grayscale
# initialize the data and labels
data = [] labels = []
print("[INFO] loading images...") for item in ['squares','triangles']: image_path = f"Train/{item}" imagePaths = sorted(list(paths.list_images(image_path))) for imagePath in imagePaths: # load the image, pre-process it, and store it in the data list image = cv2.imread(imagePath, 0) # 0 reads as grayscale image = img_to_array(image) data.append(image) labels.append([item])
# scale the raw pixel intensities to the range [0, 1] data = np.array(data, dtype="float") / 255.0 labels = np.array(labels) print("[INFO] data matrix: {} images ({:.2f}MB)".format(len(data), data.nbytes / (1024 * 1000.0)))
# binarize the labels using scikit-learn's special multi-label binarizer implementation print("[INFO] class labels:") mlb = MultiLabelBinarizer() labels = mlb.fit_transform(labels) # loop over each of the possible class labels and show them for (i, label) in enumerate(mlb.classes_): print("{}. {}".format(i + 1, label))
# partition the data into training and testing splits using 80% of the data for training and the remaining 20% for testing (trainX, testX, trainY, testY) = train_test_split(data, labels, test_size=0.2, random_state=42) # construct the image generator for data augmentation aug = ImageDataGenerator(rotation_range=25, width_shift_range=0.1, height_shift_range=0.1, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode="nearest")
# train the network print("[INFO] training network...") H = model.fit( x=aug.flow(trainX, trainY, batch_size=BS), validation_data=(testX, testY), steps_per_epoch=len(trainX) // BS, epochs=EPOCHS, verbose=1)
model.save("model_multilabel_gray.keras") with open('history_gray.pkl', 'wb') as file: pickle.dump(H.history, file) with open('classes.pkl', 'wb') as file: pickle.dump(mlb.classes_, file) [/code] Я попытался изменить различные параметры в модели, но полученная модель находит только одну из форм в изображении (только треугольник, но не квадрат, когда обе формы присутствуют.)
Я использую инструмент автоматизации рабочего процесса (построенный с Java), который позволяет вводить файл CSV. CSV будет создан вручную и на основе того, какие столбцы заполнены, определенные действия будут выполняться рабочим процессом....
У меня есть модель, и я хочу обучить ее со скоростью обучения = 0,8 в течение нескольких эпох, затем установить скорость обучения = 0,4 и продолжить обучение.
Но поскольку скорость обучения задается при компиляции модели... И что произойдет ли с...
Опишите ошибку
Четкое и краткое описание ошибки.
Чтобы воспроизвести
Шаги по воспроизведению поведения:
Выполнить следующую команду textattack...
Выполнить следующий код...
Смотреть ошибку
Ожидаемое поведение
После обучения lstm должен быть...
Опишите ошибку
Четкое и краткое описание ошибки.
Чтобы воспроизвести
Шаги по воспроизведению поведения:
Выполнить следующую команду textattack...
Выполнить следующий код...
Смотреть ошибку
Ожидаемое поведение
После обучения lstm должен быть...
В настоящее время я пытаюсь изучить влияние маскировки внимания на модель трансформатора, обученную классификации данных временных рядов. Моя модель работает до сих пор и дает мне производительность Okish, но когда я пытаюсь замаскировать внимание...