Простой пример машинного обучения с рукописными цифрами не работает с conv2d и MaxPooling2D - PullRequest
0 голосов
/ 09 февраля 2020

Я сделал простое изучение KI с tenorflow 2 с этим кодом, и все работает отлично.

# Install TensorFlow
import tensorflow as tf
print(tf.__version__)
# Import matplotlib library
import matplotlib.pyplot as plt 

#Import numpy
import numpy as np

#Dataset
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([

tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
          loss='sparse_categorical_crossentropy',
          metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)
print("Evaluation");
model.evaluate(x_test,  y_test)

plt.imshow(x_train[6], cmap="gray") # Import the image
plt.show() # Plot the image
predictions = model.predict([x_train]) # Make prediction
print("Vorhersage: ", np.argmax(predictions[6])) # Print out the number
print("Correct is: ", y_train[6])

Моя проблема заключается в том, как добавить детектирующие слои, такие как Conv2d и MaxPooling2D. Где я должен добавить эти слои, и это влияет на мои графики и мои прогнозы?

1 Ответ

1 голос
/ 09 февраля 2020

Перед передачей ввода в Convolution2d и maxpool2d вход должен иметь 4 измерения.

x_train и x_test имеют форму [BatchSize, 28, 28], но это должно быть [BatchSize, 28, 28, 1]. Поэтому мы, наконец, добавим размер канала, используя np.expand_dims()

x_train = np.expand_dims(x_train, -1)  
x_test = np.expand_dims(x_test, -1)  

model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), padding="same", input_shape=(None, 28, 28, 1)),
tf.keras.layers.Activation("relu"),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])

Да, это повлияет на ваши графики и прогнозы.

Слой свертки использует меньше весов для сравнения в плотный слой, а затем Maxpool будет принимать объекты только с максимальными значениями, чтобы делать прогнозы. Это уменьшит ваши возможности, потому что это может привести к снижению точности.

Хотя, когда у нас есть изображения большого размера, например, 500 * 500, мы должны применять слои Convolution и maxpool, чтобы уменьшить возможности, выбрав только важные особенности.

Если мы применяем функцию сглаживания и плотности на входе 500 * 500, то программе необходимо инициализировать большое количество весов, и вы можете получить ошибку Out Of Memory.

...