我试图用 keras 模块构建一个神经网络,但是当我试图运行这个代码来训练数据时,我得到了这个错误?我尝试了很多我在互联网上找到的东西,但没有奏效。
import matplotlib.pyplot as plt
import pandas as pd
import keras
from tensorflow import keras
from tensorflow.keras import layers
from keras.models import Sequential
from keras.layers import Dense, Conv2D , MaxPool2D , Flatten , Dropout
from keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.optimizers import Adam
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report,confusion_matrix
from PIL import Image
import tensorflow as tf
import cv2
import os
import numpy as np
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
labels = ['Bishop', 'King', 'Knight', 'Pawn', 'Queen', 'Rook']
img_size = 60
def get_data(data_dir):
data = []
for label in labels:
path = os.path.join(data_dir, label)
class_num = labels.index(label)
for img in os.listdir(path):
try:
img_arr = cv2.imread(os.path.join(path, img))[...,::-1] #convert BGR to RGB format
gray= cv2.cvtColor(img_arr, cv2.COLOR_BGR2GRAY)
resized_arr = np.resize(gray, (img_size, img_size)) # Reshaping images to preferred size
data.append([resized_arr, class_num])
except Exception as e:
print(e)
return np.array(data,dtype=object)
train = get_data(r'D://dersler//programing//imageproc//input//train')
val = get_data(r'D://dersler//programing//imageproc//input//test')
d_set = []
cc=0
while cc<len(labels):
thisdir = f'input//train//{labels[cc]}'
print(thisdir)
for r, d, f in os.walk(thisdir):
for file in f:
if ".jpg" or ".jpeg" or ".png" in file:
d_set.append((r.split('/')[-1],os.path.join(r.split('/')[-2],file)))
cc+=1
df = pd.DataFrame(d_set)
#
df.columns= ['class','file']
cols = df.columns.tolist()
cols = cols[-1:]+cols[:-1]
df= df[cols]
#str(box1).strip('()')
#df['folder'] = df['folder'].str.replace(r'input\train', '', regex=False)
#df.sort_values(by=['file'], inplace=True)
#abs_file_names = []
#train_dir =r'D://dersler//programing//imageproc//input//train'
#print(df)
#for file_name in df['file']:
# tmp = os.path.abspath(train_dir+os.sep+file_name)
# abs_file_names.append(tmp)
#df['file'] = abs_file_names
print(df)
x_train = []
y_train = []
x_val = []
y_val = []
for feature, label in train:
x_train.append(feature)
y_train.append(label)
for feature, label in val:
x_val.append(feature)
y_val.append(label)
# Normalize the data
x_train = np.array(x_train) / 255
x_val = np.array(x_val) / 255
x_train.reshape(-1, img_size, img_size, 1)
y_train = np.array(y_train)
x_val.reshape(-1, img_size, img_size, 1)
y_val = np.array(y_val)
print(x_train.shape,
x_val.shape
,y_train.shape
,y_val.shape)
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=(60,60,1)))
model.add(Conv2D(64, (3, 3), activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation="relu"))
model.add(Dropout(0.5))
model.add(Dense(2, activation="softmax"))
opt = keras.optimizers.Adam(learning_rate=0.01)
model.compile(
loss=keras.losses.categorical_crossentropy,
optimizer=opt,
metrics=["accuracy"],
)
train_df, test_df = train_test_split(df, test_size=0.20, random_state=42)
train_datagen = ImageDataGenerator(
rotation_range=15,
rescale=1.0 / 255,
shear_range=0.1,
zoom_range=0.2,
horizontal_flip=True,
width_shift_range=0.1,
height_shift_range=0.1,
)
DATASET_LOCATION= 'D:\dersler\programing\imageproc\input\test'
BATCH_SIZE = 16
train_generator = train_datagen.flow_from_dataframe(
train_df,
DATASET_LOCATION,
x_col="file",
y_col="class",
target_size=(60,60),
class_mode="categorical",
batch_size=BATCH_SIZE,
color_mode="grayscale",
)
example_df = train_df.sample(n=1)
example_generator = train_datagen.flow_from_dataframe(
example_df,
DATASET_LOCATION,
x_col="file",
y_col="class",
target_size=(60,60),
class_mode="categorical",
color_mode="grayscale",
)
plt.figure(figsize=(12, 12))
for i in range(0, 15):
plt.subplot(5, 3, i + 1)
for X_batch, Y_batch in example_generator:
image = X_batch[0]
image = image.reshape(IMAGE_SIZE)
plt.imshow(image)
break
plt.tight_layout()
plt.show()
我得到这个输出和错误:
input//train//Bishop
input//train//King
input//train//Knight
input//train//Pawn
input//train//Queen
input//train//Rook
file class
0 00000000.JPG Bishop
1 00000001.jpg Bishop
2 00000002.JPG Bishop
3 00000004.jpg Bishop
4 00000006.jpg Bishop
.. ... ...
403 00000124.png Rook
404 00000125.jpg Rook
405 00000127.jpg Rook
406 00000130.jpeg Rook
407 00000131.jpg Rook
[408 rows x 2 columns]
(408, 60, 60) (106, 60, 60) (408,) (106,)
Warning (from warnings module):
File "C:\Users\Kutlay\AppData\Local\Programs\Python\Python310\lib\site-packages\keras_preprocessing\image\dataframe_iterator.py", line 279
warnings.warn(
UserWarning: Found 326 invalid image filename(s) in x_col="file". These filename(s) will be ignored.
Found 0 validated image filenames belonging to 0 classes.
Warning (from warnings module):
File "C:\Users\Kutlay\AppData\Local\Programs\Python\Python310\lib\site-packages\keras_preprocessing\image\dataframe_iterator.py", line 279
warnings.warn(
UserWarning: Found 1 invalid image filename(s) in x_col="file". These filename(s) will be ignored.
Found 0 validated image filenames belonging to 0 classes.
Traceback (most recent call last):
File "D:\dersler\programing\imageproc\keras_classification.py", line 154, in <module>
image = X_batch[0]
IndexError: index 0 is out of bounds for axis 0 with size 0
可能是什么问题以及如何解决?