Hyperparameter-Tuning для предварительно обученных NN от TensorFlow - PullRequest
2 голосов
/ 29 марта 2019

Я начинаю изучать 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])
...