【问题标题】:Hyperparameter-Tuning for pretrained NN from TensorFlow来自 TensorFlow 的预训练 NN 的超参数调整
【发布时间】:2019-08-20 17:58:31
【问题描述】:

我开始学习 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])

【问题讨论】:

  • 您的问题是什么?我阅读了您的整篇文章,但我不清楚您要求其他人提供什么帮助。
  • 我的模型无法解决任务,因为准确性不够好。所以我正在考虑调整代码中的超参数,但我这样做失败了。我正在寻找改进我的分类模型的技巧。我在网上找到的大多数东西都无法在我的代码中使用。例如我尝试实施网格搜索以找到正确的最佳时期数和 batch_size:
  • 您的问题可能是因为您尝试使用 'binary_crossentropy' 和 metric='accuracy'。如stackoverflow.com/questions/42081257/… 中所述,使用“binary_crossentropy”时,您可能应该使用 metrics=[categorical_accuracy]
  • 我的网格搜索有问题。它给了我: ValueError: Error when checks input: expected dense_1_input to have 2 dimensions, but got array with shape (21, 224, 224, 3) 我给了他: grid_result = grid.fit(x_train, label_batch) 如图所示我的 x_train 代码是我的 Image_batches 和 label_batch 我加载了它们:找到属于 2 个类的 633 个图像。 Image batch shape: (32, 224, 224, 3) Labe batch shape: (32, 2) 但他不能使用这些形状进行网格搜索。我怎样才能将它们转换为正确的形状。所以他给了我最好的参数

标签: python tensorflow keras hyperparameters


【解决方案1】:

根据您在 cmets 中提到的内容,您面临以下错误。

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 和 Number of Epochs 的完整代码如下所示:

# 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))

【讨论】:

    猜你喜欢
    • 2023-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多