Я хотел сделать простую модель 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% означает, что я что-то не так делаю в обучении, и это, скорее всего,не в данных. Что я делаю не так в тренировочном процессе?