来自TensorFlow的预训练NN的超参数调整

时间:2019-03-29 18:18:33

标签: python tensorflow keras hyperparameters

我开始学习Python并尝试创建一个神经网络,该网络可以检测并定位图像的异常部分。我正在使用来自TensorFlow的经过预训练的CNN。该代码在学习我的图像并对其进行分类之前一直有效。但是,当我给他每个班级提供相同数量(大约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])

1 个答案:

答案 0 :(得分:0)

根据您在评论中提到的内容,您遇到以下错误。

  

ValueError:检查输入时出错:预期dense_1_input具有   2维,但数组的形状为(21,224,224,3)

如果您使用的是CNN,为什么第一层是Dense Layer(我从dense_1_input的名字开始理解)而不是Convolutional Layer

在第一层为卷积层的情况下,应为参数(224,224,3)传递input_shape

使用CNN完整调整Fashion_MNIST数据集的Batch_Size和时代数的完整代码如下所示:

# To support both python 2 and python 3
from __future__ import division, print_function, unicode_literals
from io import open

# Common imports
import numpy as np
import os
import tensorflow as tf
from keras.layers import Input, Conv2D, MaxPool2D, Dense, Dropout, Flatten
from keras.models import Sequential
from keras.optimizers import Adam
import matplotlib.pyplot as plt
from keras.regularizers import l1_l2
from matplotlib.pyplot import axis as ax
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import GridSearchCV


X = tf.placeholder(tf.float32, shape=[None, 784], name="X")
X_reshaped = tf.reshape(X, shape=[-1, 28, 28, 1])
y = tf.placeholder(tf.int32, shape=[None], name="y")

def create_model():

    # instantiate regularizer
    Regularizer = l1_l2(0.001)

    cnn_model = Sequential()

    cnn_model.add(Conv2D(filters = 64,kernel_size = 3, strides=(1, 1), input_shape = (28,28,1), 
                         activation='relu', data_format='channels_last', activity_regularizer=Regularizer))

    cnn_model.add(MaxPool2D(pool_size = (2, 2)))

    cnn_model.add(Dropout(0.25))

    cnn_model.add(Flatten())

    cnn_model.add(Dense(units = 32, activation = 'relu', activity_regularizer=Regularizer))

    cnn_model.add(Dense(units = 10, activation = 'sigmoid', activity_regularizer=Regularizer))

    cnn_model.compile(loss ='sparse_categorical_crossentropy', optimizer=Adam(lr=0.001),metrics =['accuracy'])
    return cnn_model

model = KerasClassifier(build_fn=create_model, verbose=0)

(X_train, y_train), (X_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()
X_train = X_train.astype(np.float32).reshape(-1, 28*28) / 255.0
X_train_reshaped = np.reshape(X_train, newshape=[-1, 28, 28, 1])

X_test = X_test.astype(np.float32).reshape(-1, 28*28) / 255.0
X_test_reshaped = np.reshape(X_test, newshape=[-1, 28, 28, 1])

y_train = y_train.astype(int)
y_test = y_test.astype(int)


batch_size = [20, 40]
epochs = [10, 50]
param_grid = dict(batch_size=batch_size, epochs=epochs)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=1, cv=3)
grid_result = grid.fit(X_train_reshaped, y_train)
# 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))

如果这是您要查找的,请告诉我。谢谢!