【发布时间】: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