При внимательном рассмотрении ошибки кажется, что с размером массива one-hot encoded
что-то не так. Я попробовал ваш код на своем ноутбуке, и он работает после внесения некоторых изменений в исходный код (не содержащий тестовую часть). Смотрите модифицированный код ниже:
import cv2
import numpy as np
from random import shuffle
from keras.models import Sequential
from keras.layers import Conv2D, InputLayer, MaxPool2D, Dense, Dropout, Flatten
from keras.optimizers import Adam
train_data = 'D:\\ML\\Tensorflow\\Datasets\\'
# Datasets folder
# - car folder - car0.jpg, car0.jpg, ..., car150.jpg
# - truck folder - truck0.jpg, truck0.jpg, ..., truck150.jpg
def one_hot_label(label):
if label == "car":
ohl = np.array([1, 0])
elif label == "truck":
ohl = np.array([0, 1])
return ohl
def train_data_with_label():
train_images = []
for i in range(151):
path = train_data+"car\\car"+str(i)+".jpg"
img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (64, 64))
train_images.append([np.array(img), one_hot_label("car")])
for j in range(151):
path = train_data+"truck\\truck"+str(j)+".jpg"
img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (64, 64))
train_images.append([np.array(img), one_hot_label("truck")])
shuffle(train_images)
return train_images
training_images = train_data_with_label()
tr_img_data = np.array([i[0] for i in training_images]).reshape(-1,64,64,1)
tr_lbl_data = np.array([i[1] for i in training_images])
model = Sequential()
model.add(InputLayer(input_shape=[64,64,1]))
model.add(Conv2D(filters=32,kernel_size=5,strides=1,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=5,padding='same'))
model.add(Conv2D(filters=50,kernel_size=5,strides=1,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=5,padding='same'))
model.add(Conv2D(filters=80,kernel_size=5,strides=1,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=5,padding='same'))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512,activation='relu'))
model.add(Dropout(rate=0.5))
model.add(Dense(2,activation='softmax'))
optimizer = Adam(lr=1e-3)
model.compile(optimizer=optimizer,loss='categorical_crossentropy',metrics=['accuracy'])
model.fit(x=tr_img_data,y=tr_lbl_data,epochs=10,batch_size=100)
model.summary()
Выход:
Epoch 1/10
302/302 [==============================] - 1s 3ms/step - loss: 5.4860 - acc: 0.5000
Epoch 2/10
302/302 [==============================] - 0s 264us/step - loss: 5.2789 - acc: 0.5430
Epoch 3/10
302/302 [==============================] - 0s 264us/step - loss: 4.8643 - acc: 0.5298
Epoch 4/10
302/302 [==============================] - 0s 264us/step - loss: 4.0198 - acc: 0.5232
Epoch 5/10
302/302 [==============================] - 0s 264us/step - loss: 2.5126 - acc: 0.5000
Epoch 6/10
302/302 [==============================] - 0s 264us/step - loss: 1.1055 - acc: 0.5199
Epoch 7/10
302/302 [==============================] - 0s 281us/step - loss: 0.9190 - acc: 0.5298
Epoch 8/10
302/302 [==============================] - 0s 267us/step - loss: 0.7264 - acc: 0.5563
Epoch 9/10
302/302 [==============================] - 0s 264us/step - loss: 0.7535 - acc: 0.4834
Epoch 10/10
302/302 [==============================] - 0s 264us/step - loss: 0.7393 - acc: 0.4901
Layer (type) Output Shape Param #
=================================================================
conv2d_7 (Conv2D) (None, 64, 64, 32) 832
_________________________________________________________________
max_pooling2d_7 (MaxPooling2 (None, 13, 13, 32) 0
_________________________________________________________________
conv2d_8 (Conv2D) (None, 13, 13, 50) 40050
_________________________________________________________________
max_pooling2d_8 (MaxPooling2 (None, 3, 3, 50) 0
_________________________________________________________________
conv2d_9 (Conv2D) (None, 3, 3, 80) 100080
_________________________________________________________________
max_pooling2d_9 (MaxPooling2 (None, 1, 1, 80) 0
_________________________________________________________________
dropout_5 (Dropout) (None, 1, 1, 80) 0
_________________________________________________________________
flatten_3 (Flatten) (None, 80) 0
_________________________________________________________________
dense_5 (Dense) (None, 512) 41472
_________________________________________________________________
dropout_6 (Dropout) (None, 512) 0
_________________________________________________________________
dense_6 (Dense) (None, 2) 1026
=================================================================
Total params: 183,460
Trainable params: 183,460
Non-trainable params: 0
_________________________________________________________________