Я получаю разные ответы каждый раз, когда пытаюсь распознать изображение с нейронной сетью - PullRequest
0 голосов
/ 05 июня 2019

обновление 06/06/19

Здравствуйте, я использую этот учебник . Я сделал все в соответствии с инструкциями.Но моя сеть работает как генератор случайных значений =) Совершенно неправильно понимаю, что я делаю неправильно. Буду благодарен за любую помощь.

from tensorflow.keras.models import load_model
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Convolution2D
from tensorflow.keras.layers import MaxPooling2D
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Dense
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import numpy as np
from keras.preprocessing import image
classifier = Sequential()
# Step 1 - Convolution
classifier.add(Convolution2D(32, 3, 3, input_shape = (64, 64, 3), activation = 'relu'))
# Step 2 - Pooling
classifier.add(MaxPooling2D(pool_size = (2, 2)))
#сжатие
classifier.add(Flatten())

#full connection
classifier.add(Dense(128, activation='relu'))
classifier.add(Dense(1, activation='sigmoid'))

#compiling CNN

classifier.compile(optimizer='adam',loss='binary_crossentropy', metrics=['accuracy'])
train_datagen = ImageDataGenerator(rescale=1./255)
training_set = train_datagen.flow_from_directory(
        'dataset/training_set',
        target_size=(64,64),
        batch_size=32,
        class_mode='binary'
        )
test_set = train_datagen.flow_from_directory(
        'dataset/test_set',
        target_size=(64,64),
        batch_size=32,
        class_mode='binary'
        )
classifier.fit_generator(
        training_set,
                         steps_per_epoch = 8000,
                         epochs = 25,
                         validation_data = test_set,
                         validation_steps = 2000
        )

model = load_model('my_model1.h5')

model.summary()

test_image = image.load_img('random10.jpg',target_size=(64,64,3))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis=0)
result=classifier.predict(test_image)
training_set.class_indices

if result[0][0]>=0.5:
    prediction='dog'
else:
    prediction='cat';
print((result[0][0])*100)
print(prediction)
from tensorflow.keras.models import load_model
classifier.save('my_model1.h5')

Я пытался увеличить количество эпох, но это не помогло

1 Ответ

0 голосов
/ 05 июня 2019

Я действительно не могу понять слово «по-разному», но я предполагаю, что оно означает «Вы получаете разные ответы каждый раз, когда запускаете этот код».

Вопрос в том, что вы ожидаете от "не так уж иного"?

То, что вы делаете, используя этот код, тренирует его снова каждый раз, когда вы запускаете.

Вы должны сначала понять кое-что, что каждый раз, когда вы звоните classifier = Sequential() без classifier.load_weights(), он будет инициировать веса со случайными числами.

Таким образом, каждый раз, когда вы запускаете этот код или даже каждый код в мире с разными весами, он НИКОГДА не будет предсказывать одно и то же значение (result).

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

Примерно так.

classifier = Sequential()
classifier.add(Convolution2D(32, 3, 3, input_shape = (64, 64, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Convolution2D(64, 3, 3, activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Convolution2D(128, 3, 3, activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Convolution2D(256, 3, 3, activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Flatten())

#full connection
classifier.add(Dense(128, activation='relu'))
classifier.add(Dense(1, activation='sigmoid'))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...