-1

我试图用 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

可能是什么问题以及如何解决?

4

0 回答 0