# цикл по изображениям
for imagePath in imagePaths:
for p in imagePaths:
print(p)
# загружаем изображение, меняем размер на 32x32 пикселей (без учета
# соотношения сторон), сглаживаем его в 32x32x3=3072 пикселей и
# добавляем в список
image = cv2.imread(imagePath)
if image is None:
continue
print(image)
image = cv2.resize(image, (32, 32)).flatten()
data.append(image)
# извлекаем метку класса из пути к изображению и обновляем
# список меток
label = imagePath.split(os.path.sep)[-2]
labels.append(label)
# масштабируем интенсивности пикселей в диапазон [0, 1]
data = np.array(data, dtype="float") / 255.0
labels = np.array(labels)
print(data.shape)
# разбиваем данные на обучающую и тестовую выборки, используя 75%
# данных для обучения и оставшиеся 25% для тестирования
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split (data,
labels,
test_size=0.25,
train_size=0.75,
random_state=42)
# конвертируем метки из целых чисел в векторы (для 2х классов при
# бинарной классификации вам следует использовать функцию Keras
# “to_categorical” вместо “LabelBinarizer” из scikit-learn, которая
# не возвращает вектор)
lb = LabelBinarizer()
trainY = lb.fit_transform(trainY)
testY = lb.transform(testY)
# определим архитектуру 8-8-1 с помощью Keras
def create_model(lyrs=[8], act='linear', opt='Adam', dr=0.0):
# set random seed for reproducibility
seed(42)
tf.random.set_seed(42)
model = tf.keras.Sequential()
# create first hidden layer
model.add(tf.keras.Dense(lyrs[0], input_dim=X_train.shape[1], activation=act))
# create additional hidden layers
for i in range(1, len(lyrs)):
model.add(tf.keras.Dense(lyrs[i], activation=act))
# add dropout, default is none
model.add(tf.keras.Dropout(dr))
# create output layer
model.add(tf.keras.Dense(1, activation='sigmoid')) # output layer
model.complete(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])
return model
# инициализируем скорость обучения и общее число эпох
model = tf.keras.KerasClassifier(build_nf=create_model, verbose=0)
# define the grid search parameters
batch_size = [16, 32, 64]
epochs = [50, 100]
param_grid = dict(batch_size=batch_size, ephochs=epochs)
# search the grid
grid = tf.keras.GridSearchCV(estimator=model,
param_grid=param_grid,
cv=3,
verbose=2) # include n_jobs=-1 if you are using CPU
grid_result =
grid.fit(X_train, y_train)
# обучаем нейросеть
H =
model.fit(trainX, trainY, validation_data=(testX, testY),
epochs=EPOCHS, batch_size=32)
# оцениваем нейросеть
print("[INFO] evaluating network...")
predictions = model.predict(testX, batch_size=32)
print(classification_report(testY.argmax(axis=1),
predictions.argmax(axis=1), target_names=lb.classes_))
# строим графики потерь и точности
N = np.arange(0, EPOCHS)
plt.style.use("ggplot")
plt.figure()
plt.plot(N, H.history["loss"], label="train_loss")
plt.plot(N, H.history["val_loss"], label="val_loss")
plt.plot(N, H.history["acc"], label="train_acc")
plt.plot(N, H.history["val_acc"], label="val_acc")
plt.title("Training Loss and Accuracy (Simple NN)")
plt.xlabel("Epoch #")
plt.ylabel("Loss/Accuracy")
plt.legend()
plt.savefig(args["plot"])