У меня есть модель Keras для предсказания ходов в игре.У меня есть форма ввода (160,120 ,1)
.У меня есть следующая модель с выходом 9 узлов:
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.convolutional import Conv2D, MaxPooling2D, ZeroPadding2D
from keras.layers.normalization import BatchNormalization
from keras.optimizers import Adam
from keras.regularizers import l2
from keras import optimizers
def alexnet_model(n_classes=9, l2_reg=0.,
weights=None):
# Initialize model
alexnet = Sequential()
alexnet.add(Conv2D(24, (11, 11), input_shape=(160,120,1), activation ='relu'))
alexnet.add(MaxPooling2D(pool_size=(2, 2)))
alexnet.add(BatchNormalization())
alexnet.add(Conv2D(36, (5, 5), activation ='relu'))
alexnet.add(MaxPooling2D(pool_size=(2, 2)))
alexnet.add(Conv2D(48, (3, 3), activation ='relu'))
alexnet.add(Conv2D(54, (3, 3), activation ='relu'))
alexnet.add(MaxPooling2D(pool_size=(2, 2)))
alexnet.add(Flatten())
alexnet.add(Dense(300, activation ='tanh'))
alexnet.add(Dropout(0.5))
alexnet.add(Dense(200, activation ='tanh'))
alexnet.add(Dropout(0.5))
alexnet.add(Dense(100, activation ='tanh'))
alexnet.add(Dropout(0.5))
alexnet.add(Dense(n_classes , activation = 'softmax'))
optimizer = Adam(lr=1e-3)
alexnet.compile(loss='categorical_crossentropy', optimizer=optimizer)
alexnet.summary()
return alexnet
Затем я запускаю учебный скрипт.Моя X
имеет форму (12862, 160, 120, 1)
и y
(1000,9)
.
import numpy as np
import tensorflow as tf
from random import shuffle
import pandas as pd
from tensorflow.keras import layers,models
from keras.preprocessing.image import ImageDataGenerator
import tensorflow as tf
# what to start at
START_NUMBER = 60
# what to end at
hm_data = 111
# use a previous model to begin?
START_FRESH = False
WIDTH = 160
HEIGHT = 120
LR = 1e-3
EPOCHS = 1
MODEL_NAME = 'model_new.h5'
EXISTING_MODEL_NAME = ''
model = alexnet_model()
X=[]
Y=[]
for i in range(EPOCHS):
train_data = np.load('training_data_1.npy')
print(len(train_data))
train = train_data[0:12862]
test = train_data[-1000:]
X = np.array([i[0] for i in train]).reshape(-1,WIDTH,HEIGHT,1)
Y = np.array([i[1] for i in train])
test_x = np.array([i[0] for i in test]).reshape(-1,WIDTH,HEIGHT,1)
test_y = np.array([i[1] for i in test])
print(X.shape)
model.fit(X, Y , batch_size = 16, epochs = 10 , validation_data = (test_x, test_y), verbose=1)
model.save(MODEL_NAME)
# tensorboard --logdir=foo:C:/Users/H/Desktop/ai-gaming-phase5/log
После тестирования модели я получаю вывод:
array([[2.8518048e-01, 5.5075828e-03, 7.3730588e-02, 5.3255934e-02,
1.0635615e-01, 6.4690344e-02, 9.1519929e-08, 7.0413840e-08,
4.1127869e-01]], dtype=float32)
с этой линиейкода:
model.predict(X[100].reshape(-1,160,120,1))
Я знаю, что тестировать модель на X
нехорошо, но неважно, какое изображение я использую, но я получаю тот же вывод.Просто для справки (мои Y
значения):
w = [1,0,0,0,0,0,0,0,0]
s = [0,1,0,0,0,0,0,0,0]
a = [0,0,1,0,0,0,0,0,0]
d = [0,0,0,1,0,0,0,0,0]
wa = [0,0,0,0,1,0,0,0,0]
wd = [0,0,0,0,0,1,0,0,0]
sa = [0,0,0,0,0,0,1,0,0]
sd = [0,0,0,0,0,0,0,1,0]
nk = [0,0,0,0,0,0,0,0,1]
Я пробовал другую модель, но она все еще не работает.Вот количество данных обучения для каждого класса:
Counter({'[1, 0, 0, 0, 0, 0, 0, 0, 0]': 5000,
'[0, 0, 0, 0, 0, 0, 0, 0, 1]': 5000,
'[0, 0, 0, 0, 1, 0, 0, 0, 0]': 1183,
'[0, 0, 0, 0, 0, 1, 0, 0, 0]': 982,
'[0, 0, 1, 0, 0, 0, 0, 0, 0]': 832,
'[0, 0, 0, 1, 0, 0, 0, 0, 0]': 764,
'[0, 1, 0, 0, 0, 0, 0, 0, 0]': 101})
Я думаю, что проблема в модели, но я не знаю, как ее изменить.Может ли это быть проблемой небольших тренировочных данных?Значение потерь также не уменьшается: loss: 1.7416 - val_loss: 1.4639
.Оно уменьшается только на несколько знаков после запятой, а иногда даже возвращается вверх.