如何在识别卷积神经网络的图像中添加图层

时间:2019-08-01 22:16:07

标签: tensorflow machine-learning keras neural-network image-recognition

我正在尝试建立一个卷积神经网络来检测情绪(所以简单的图像识别AI)。到目前为止,我已经能够将图像调整为32、32大小,并将每个像素的RGB值添加到列表中。我现在应该如何进行?我一直在尝试添加卷积层,但是在实现过程中遇到了一些麻烦,我不确定隐藏层的实际构造应如何。

1 个答案:

答案 0 :(得分:0)

使用google colab和MNIST数据集进行示例回答。

第一步: -进行导入,获取数据集,然后缩放并分为训练和测试。 -定义模型(我使用的模型非常好,更简单的模型也可以使用)

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
from google.colab import files
from keras.preprocessing import image

class myCallback(tf.keras.callbacks.Callback):
  def on_epoch_end(self, epoch, logs={}):
    if(logs.get('acc')>0.998):
      print("\nReached 99.8% accuracy so cancelling training!")
      self.model.stop_training = True

callbacks = myCallback()


mnist = tf.keras.datasets.mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images, test_images = training_images/255.0, test_images/255.0
training_images = training_images.reshape(60000, 28, 28, 1)
test_images = test_images.reshape(10000, 28, 28, 1)

model = tf.keras.models.Sequential([
  tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(28, 28, 1)),
  tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
  tf.keras.layers.MaxPooling2D(2, 2),
  tf.keras.layers.Dropout(0.20),
  tf.keras.layers.Conv2D(64, (3,3), activation='relu', padding = "same"),
  tf.keras.layers.Conv2D(64, (3,3), activation='relu', padding = "same"),
  tf.keras.layers.MaxPooling2D(2, 2),
  tf.keras.layers.Dropout(0.25),
  tf.keras.layers.Conv2D(64, (3,3), activation='relu', padding = "same"),
  tf.keras.layers.Dropout(0.25),
  tf.keras.layers.Flatten(),           
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.BatchNormalization(),
  tf.keras.layers.Dropout(0.25),                      
  tf.keras.layers.Dense(10, activation='softmax') 

])  


print (model.summary())

步骤2: 编译和训练模型(也使用训练集在训练过程中进行评估)

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=20,callbacks =[callbacks])
test_loss = model.evaluate(test_images, test_labels)

可选: 使用您自己的图像进行测试。此上传部分特定于google colab。

uploaded = files.upload()
for fn in uploaded.keys():

  path = '/content/' + fn
  img = image.load_img(path, target_size=(28, 28),color_mode = "grayscale")

在我们预测测试图片之前,必须进行一些缩放和调整才能使测试图片“ MNIST”。

im2arr = np.array(img)
im2arr = im2arr-255.0
im2arr = im2arr*-1
image = im2arr
im2arr_scale = im2arr/255.0
im2arr = im2arr.reshape(1,28,28,1)
im2arr_scale = im2arr_scale.reshape(1,28,28,1)

y_pred = model.predict(im2arr)
y_pred2 = model.predict(im2arr_scale)



print("non scaled : " + str(np.argmax(y_pred)) + " probability: " + str(y_pred[0][np.argmax(y_pred)]))
print("scaled: " + str(np.argmax(y_pred2)) + " probability: " + str(y_pred2[0][np.argmax(y_pred2)]))
print (y_pred)
print (y_pred2)

绘制测试图像

plt.grid(False)
plt.gray()
plt.axis('off')
plt.imshow(image)
plt.show()