Точность набора поездов в каждой эпохе составляет ровно 50% - PullRequest
0 голосов
/ 01 ноября 2019

Я хотел сделать простую модель CNN, которая предсказывает цвет изображения (красный или зеленый). Я искусственно создал такой набор данных изображений, содержащих красный или зеленый фон, и построил на нем модель CNN. Точность поезда составляла 50% в каждую эпоху. Я думал, что это были данные, но не смог найти ошибку в данных. Поэтому я подумал, что давайте создадим случайные данные и посмотрим, будет ли он по-прежнему последовательно 50%. В этом случае он должен колебаться около 50%, но не 50% каждый раз. Вот код, который я использовал:

from keras.preprocessing.image import ImageDataGenerator
from keras.applications.vgg16 import VGG16
from keras.layers import Dense, Flatten, Input
from keras.models import Model

import numpy as np

X = np.random.rand(140,224,224,3)
y = [0]*70 + [1]*70
y = to_categorical(y)

def train_model():
    vgg = VGG16(weights="imagenet", include_top=False)

    input = Input(shape=(224,224,3),name = 'image_input')
    output_vgg16_conv = vgg(input)

    x = Flatten(name='flatten')(output_vgg16_conv)
    x = Dense(128, activation='relu', name='fc1')(x)
    x = Dense(128, activation='relu', name='fc2')(x)
    x = Dense(2, activation='softmax', name='predictions')(x)

    model = Model(input=input, output=x)

    print(model.summary())

    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    model.fit(X,y, epochs=10, batch_size=32)
    return model

train_model()

Я получил следующий вывод:

Layer (type)                 Output Shape              Param #   
=================================================================
image_input (InputLayer)     (None, 224, 224, 3)       0         
_________________________________________________________________
vgg16 (Model)                multiple                  14714688  
_________________________________________________________________
flatten (Flatten)            (None, 25088)             0         
_________________________________________________________________
fc1 (Dense)                  (None, 128)               3211392   
_________________________________________________________________
fc2 (Dense)                  (None, 128)               16512     
_________________________________________________________________
predictions (Dense)          (None, 2)                 258       
=================================================================
Total params: 17,942,850
Trainable params: 17,942,850
Non-trainable params: 0
_________________________________________________________________
None
Epoch 1/10
140/140 [==============================] - 6s 40ms/step - loss: 6.4980 - acc: 0.4857
Epoch 2/10
140/140 [==============================] - 4s 27ms/step - loss: 8.0590 - acc: 0.5000
Epoch 3/10
140/140 [==============================] - 4s 27ms/step - loss: 8.0590 - acc: 0.5000
Epoch 4/10
140/140 [==============================] - 4s 27ms/step - loss: 8.0590 - acc: 0.5000
Epoch 5/10
140/140 [==============================] - 4s 27ms/step - loss: 8.0590 - acc: 0.5000
Epoch 6/10
140/140 [==============================] - 4s 27ms/step - loss: 8.0590 - acc: 0.5000
Epoch 7/10
140/140 [==============================] - 4s 27ms/step - loss: 8.0590 - acc: 0.5000
Epoch 8/10
140/140 [==============================] - 4s 27ms/step - loss: 8.0590 - acc: 0.5000
Epoch 9/10
140/140 [==============================] - 4s 27ms/step - loss: 8.0590 - acc: 0.5000
Epoch 10/10
140/140 [==============================] - 4s 27ms/step - loss: 8.0590 - acc: 0.5000

Постоянное получение 50% означает, что я что-то не так делаю в обучении, и это, скорее всего,не в данных. Что я делаю не так в тренировочном процессе?

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