I'm trying to train a model of image recognition.But the model.fit is always returning the error:
ValueError Traceback (most recent call last)
Cell In\[106\], line 1
\----\> 1 history = model.fit(x_train, batch_size=batch_size, epochs=epochs)
File c:\\Users\\rochav3\\Anaconda\\envs\\py_OBJ_DETECTION\\lib\\site-packages\\keras\\utils\\traceback_utils.py:67, in filter_traceback..error_handler(\*args, \*\*kwargs)
65 except Exception as e: # pylint: disable=broad-except
66 filtered_tb = \_process_traceback_frames(e.__traceback__)
\---\> 67 raise e.with_traceback(filtered_tb) from None
68 finally:
69 del filtered_tb
File c:\\Users\\rochav3\\Anaconda\\envs\\py_OBJ_DETECTION\\lib\\site-packages\\tensorflow\\python\\framework\\constant_op.py:102, in convert_to_eager_tensor(value, ctx, dtype)
100 dtype = dtypes.as_dtype(dtype).as_datatype_enum
101 ctx.ensure_initialized()
\--\> 102 return ops.EagerTensor(value, ctx.device_name, dtype)
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray).
I saw some other topics related to this here, but nothing solved my problem, the float32 also did not solved.
Follow below my code.
Basically, I'm getting a dataset from a pickle file, with PILLOW images and converting them to grayscale and converting to numpy arrays.
`# %%
import tensorflow as tf
import cv2
import pickle
import numpy as np
from sklearn.model_selection import train_test_split
import random
import pandas as pd
import PIL
from PIL import ImageOps
with open('C:\Visual Studio\Django\DetectTool\OpenClosed_dataset.pickle', 'rb') as f:
data = pickle.load(f)
# %%
np_data =[]
tam_data = len(data[0])
for i in range(tam_data):
np_data.append((np.asarray(ImageOps.grayscale(data[0][i])),
np.asarray(data[1][i])))
# %%
ds_Valves = []
for i in range(100):
ds_Valves.append((np_data[i][0], np_data[i][1]))
# %%
random.shuffle(ds_Valves)
df_Valves = pd.DataFrame(ds_Valves)
df_Valves.rename(columns= {0 : 'Image', 1: 'State'}, inplace= True)
# %%
df_X = df_Valves['Image']
df_Y = df_Valves.drop(columns=['Image'])
# %%
df_X = np.asarray(df_X).astype('object')
df_Y = np.asarray(df_Y).astype('float32')
# %%
x_train, x_test, y_train, y_test = train_test_split(df_X, df_Y, test_size=0.20, random_state=0 )
# %%
# Defina os hiperparâmetros do modelo
batch_size = 32
epochs = 10
learning_rate = 0.001
# %%
# Escolha uma arquitetura de modelo e compile-o
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(510, 510,3)),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(3, activation='softmax')
])
# %%
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=learning_rate),
loss='categorical_crossentropy',
metrics=['accuracy'])
# %%
history = model.fit(x_train, batch_size=batch_size, epochs=epochs)`
I saw some other topics related to this here, but nothing solved my problem, the float32 also did not solved.
Update: Just found a workaround here.
- changed my dataset from .PNG to .JPG
- Instead of using PIL, I used cv2
- I created the tensor during the dataset creation.
I believe the mistake was that I was trying to create the tensor with the PIL image "in memory" and not the file.
source https://stackoverflow.com/questions/76006839/failed-to-convert-a-numpy-array-to-a-tensor-when-trying-to-train-the-image-mode
Comments
Post a Comment