假设我有一组自己的照片数据集。我希望训练一个神经网络,以便它能够识别给定图像中是否是我。
但是,要训练一个神经网络,我必须至少有两个类别,所以我必须有自己的照片(我已经有了),还必须有“不是我”的照片,我不知道该如何处理这些照片。
所以,我想知道的是,“不是我”的照片是什么?它们只是不包含我的随机照片吗?我试过了,但没有效果。
我知道在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
这是我的模型声明:
# 将输出层展平为一维x = layers.Flatten()(last_output)# 添加一个具有1,024个隐藏单元和ReLU激活的全连接层x = layers.Dense(1024, activation='relu')(x)# 添加0.2的丢弃率x = layers.Dropout(0.2)(x)# 添加一个用于分类的最终sigmoid层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.]]
。
所以我想知道:
- 如何解决我的问题
- 我是否应该使用神经网络,也许有其他不涉及神经网络的解决方案
- 另外,在我的智能手机上有一个智能锁功能 – 当我想解锁手机时,它只需识别我的脸。因此,似乎我的问题是有解决方案的。
回答:
不使用神经网络几乎不可能进行任何图像识别,所以在这方面,你的方法是正确的。
然而,对于大多数图像识别问题,卷积层是一个聪明的主意,因为它们最初是为模拟连接到视神经的神经通路而创建的。另外,值得检查你输入神经网络的“你”和“不是你”的数量,否则网络往往会只预测一个类别。
对于“不是你”的图像,一个好的选择是使用一些不是你的其他人的照片,再加上一些其他随机的东西的照片。