Как бы я улучшил свою модель так, чтобы она работала с другими персонажами, которых нет в наборе данных? - PullRequest
1 голос
/ 25 апреля 2019

В моем последнем сообщении, связанном здесь , было сказано, что я должен изменить свою модель, чтобы она стала лучше. Чтобы процитировать единственный ответчик на мои вопросы (еще раз спасибо, сэр):

Точность прогнозирования является метрикой того, насколько хороша ваша архитектура нейронной сети, а также зависит от ваших данных поезда / проверки. Вам нужно будет настроить свою нейронную сеть таким образом, чтобы вы хорошо обобщали, регулируя гиперпараметры, такие как количество слоев, тип слоев, скорость обучения, оптимизатор и т. Д. ...

Я хотел бы знать, как бы я это сделал. Или, по крайней мере, указывать в правильном направлении. Я, честно говоря, заблудился в теории и на практике.

Единственное, что мне удалось сделать, это настроить период выше 100. Я также очистил изображения, чтобы их можно было идентифицировать как можно больше.

В настоящее время вот как я создаю свою модель. Он основан только на учебнике Tensorflow 2.0.

import numpy as np
import tensorflow as tf
from tensorflow import keras

# Load and prepare the MNIST dataset. Convert the samples from integers to floating-point numbers:
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

def createModel():  
  # Build the tf.keras.Sequential model by stacking layers. 
  # Choose an optimizer and loss function used for training:
  model = tf.keras.models.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(10, activation='softmax')
  ])

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

  return model

model = createModel()
model.fit(x_train, y_train, epochs=102, validation_data=(x_test, y_test))
model.evaluate(x_test, y_test)

Это дало мне точность проверки около 0,90000. Но его производительность по отношению к изображениям рукописных символов, которые я извлек из документов, мрачна. Я также хотел бы, чтобы он был расширен таким образом, чтобы он мог также читать другие выбранные символы, но я предполагаю, что это может быть другим вопросом для другого дня.

Спасибо!

1 Ответ

1 голос
/ 29 апреля 2019

В начале может быть несколько слоев Свертка / Макс. Пул , которые будут выполнять извлечение объектов путем сканирования изображения. После этого вы используете полностью подключенный NN, как вы делали раньше, и softmax.

Вы можете создать модель с CNN таким образом:

from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout 
from keras.models import Sequential 

# Create the model
model = Sequential()

# Add the 1st Convolution/ max pool
model.add(Conv2D(40, kernel_size=5, padding="same",input_shape=(28, 28, 1), activation = 'relu')) 
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) 

# 2nd convolution / max pool
model.add(Conv2D(200, kernel_size=3, padding="same", activation = 'relu')) 
model.add(MaxPooling2D(pool_size=(3, 3), strides=(1, 1)))

# 3rd convolution/ max pool
model.add(Conv2D(512, kernel_size=3, padding="valid", activation = 'relu')) 
model.add(MaxPooling2D(pool_size=(3, 3), strides=(1, 1)))

# Reduce dimensions from 2d to 1d
model.add(Flatten()) 
model.add(Dense(units=100, activation='relu'))

# Add dropout to prevent overfitting
model.add(Dropout(0.5))

# Final fullyconnected layer
model.add(Dense(10, activation="softmax")) 
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 

print(model.summary()) 

, который возвращает следующую модель:

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 28, 28, 40)        1040      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 14, 14, 40)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 14, 14, 200)       72200     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 12, 12, 200)       0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 10, 10, 512)       922112    
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 8, 8, 512)         0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 32768)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 100)               3276900   
_________________________________________________________________
dropout_1 (Dropout)          (None, 100)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 10)                1010      
=================================================================
Total params: 4,273,262
Trainable params: 4,273,262
Non-trainable params: 0
_________________________________________________________________
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...