Я начинаю изучать Python и пытаюсь создать нейронную сеть, которая обнаруживает и локализует аномальные части изображений.Я использую предварительно обученный CNN от TensorFlow.Код работает, поскольку он изучает мои изображения и классифицирует их.Но когда я даю ему одинаковое количество (около 100) изображений для каждого класса.точность составляет около 50%, что является случайным для двух классов.Поэтому я ищу решение для этого прямо сейчас.Проблему локализации я решаю, разрезая мои изображения на несколько частей.Аномалия отделяется от неаномальной области, в то время как каждое изображение имеет ссылку на свое местоположение в своем названии.Поэтому, когда изображение классифицируется как определенный класс, каждый также узнает о его местонахождении по его имени.
первый вариант: мне нужно найти способ увеличить количество моих изображений, чтобы посмотреть, улучшит ли оно моеТочность. Я еще не работал над этим.Второй вариант: пытаясь настроить гиперпараметры CNN, возможно, поместите мои изображения в более ранние слои.Я просмотрел несколько учебных пособий и попытался их реализовать, но все они потерпели неудачу в основном из-за формы массивов или несовместимых чисел.
# Use scikit-learn to grid search the batch size and epochs
import numpy
from sklearn.model_selection import GridSearchCV
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
# Function to create model, required for KerasClassifier
def create_model():
# create model
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# load dataset
# create model
model = KerasClassifier(build_fn=create_model, verbose=0)
# define the grid search parameters
batch_size = [10, 20, 40, 60, 80, 100]
epochs = [10, 50, 100]
param_grid = dict(batch_size=batch_size, epochs=epochs)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1)
grid_result = grid.fit(x_train, label_batch)
# summarize results
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
print("%f (%f) with: %r" % (mean, stdev, param))
init = tf.global_variables_initializer()
sess.run(init)
result = model.predict(image_batch)
result.shape
model.compile(
optimizer=tf.train.AdamOptimizer(),
loss='categorical_crossentropy',
metrics=['accuracy'])
class CollectBatchStats(tf.keras.callbacks.Callback):
def __init__(self):
self.batch_losses = []
self.batch_acc = []
def on_batch_end(self, batch, logs=None):
self.batch_losses.append(logs['loss'])
self.batch_acc.append(logs['acc'])
steps_per_epoch = image_data.samples//image_data.batch_size
batch_stats = CollectBatchStats()
model.fit((item for item in image_data), epochs=1,
steps_per_epoch=steps_per_epoch,
callbacks = [batch_stats])