【发布时间】:2020-09-04 15:29:01
【问题描述】:
所以,假设我有一个包含我自己照片的数据集。而我想做的是训练一个神经网络,这样它就可以识别给定图像上是否是我。
但是要训练一个神经网络,我必须至少有 2 个类,所以我必须有我自己的照片(我已经有),我还必须有“不是我自己”的照片,我没有知道该怎么做。
那么,我想知道的是,“不是我”的照片是什么?那只是不包含我的随机照片吗,因为我已经尝试过了,但它不起作用。
现在,我知道在 stackoverflow 上有类似的问题,但没有答案,这将帮助我解决我的问题。
这里有一些代码:
我使用预训练模型来更好地识别图像:
pre_trained_model = InceptionV3(input_shape = (150, 150, 3),
include_top = False,
weights = None)
pre_trained_model.load_weights('img_model.h5')
for layer in pre_trained_model.layers:
layer.trainable = False
last_layer = pre_trained_model.get_layer('mixed7')
last_output = last_layer.output
还有我的模型声明:
# Flatten the output layer to 1 dimension
x = layers.Flatten()(last_output)
# Add a fully connected layer with 1,024 hidden units and ReLU activation
x = layers.Dense(1024, activation='relu')(x)
# Add a dropout rate of 0.2
x = layers.Dropout(0.2)(x)
# Add a final sigmoid layer for classification
x = layers.Dense(1, activation='sigmoid')(x)
model = Model( pre_trained_model.input, x)
model.compile(optimizer = RMSprop(lr=0.0001),
loss = 'binary_crossentropy',
metrics = ['accuracy'])
我在这里训练我的模型:
history = model.fit(
train_generator,
validation_data = validation_generator,
epochs = 2,
verbose = 2)
最后,我自己测试网络:
img = image.load_img('imgs/some_img_of_me.jpg', target_size=(150, 150))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
classes = model.predict(x)
print(classes)
这是上面代码的结果:
[[0.]]
问题是模型总是返回[[0.]],不管给定图像上是否是我。
所以我想知道:
- 如何解决我的问题
- 我是否应该使用神经网络,也许还有另一种不涉及它们的解决方案
- 在我的智能手机上我也有这个智能锁功能 - 当我想解锁我的智能手机时,它只会识别我的脸。所以看来我的问题的解决方案是存在的。
【问题讨论】:
-
几个cmets: 1. 不涉及某种形式的神经网络,通常很难做任何图像分类问题。 2. 看起来你没有使用卷积层,这通常对图像分类很有用。 3. 我觉得用别人的照片来代替“不是你”的照片是个不错的选择。否则我不确定为什么你的模型总是返回 0,但值得检查一下你正在训练它与“你”有多少“不是你”的图片。如果你使用太多一个,神经网络通常最终只会预测那个结果。
-
抱歉,发的太早了……我剩下的 cmets 都在里面了
-
谢谢!你解释了很多! “我觉得用其他人的照片来代替‘不是你’的照片是一个不错的选择”,我也想过,我也使用了我的预训练模型中的卷积层。
-
你应该创建一个答案,这样我就可以投票了。再次感谢。特别是对于这个:“如果你使用太多一个,神经网络通常最终只会预测那个结果。”,因为我遇到了这个确切的问题。
标签: python tensorflow machine-learning keras neural-network