Al reconocer las clases de gestos con las manos, siempre obtengo la misma clase, aunque probé cambiando los parámetros e incluso pasé los datos sin normalizar:
df_train = pd.read_csv('train_dataset.csv') df_train = df_train.drop(columns=['Unnamed: 0'], axis=1) df_train = df_train.fillna(0) x_train = df_train.drop(['y'], axis=1) y_train = df_train['y'] x_train = x_train / 310 model = keras.models.Sequential([Dense(32, input_shape=(42,), activation='relu'), Dense(64, activation='relu'), Dense(6, activation='softmax')]) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train_cat, batch_size=16, epochs=9, validation_split=0.2) model.save("gestures_model.h5")
Aquí hay un código principal:
REV_CLASS_MAP = { 0: "up", 1: "down", 2: "right", 3: "left", 4: "forward", 5: "back" } def mapper(val): return REV_CLASS_MAP[val] if len(data[data.index(new_row)]) > 0: df = pd.DataFrame(data, columns=columns) df = df.fillna(0) df = df / 310 pred = model.predict(df) move_code = np.argmax(pred[0]) user_move_name = mapper(move_code) print(user_move_name)
Aquí hay un ejemplo de datos de entrada:
56,172,72,169,88,155,100,144,111,139,78,120,81,94,82,77,82,62,66,120,62,104,62,124,64,136,54,122,50,110,52,130,55,139,43,126,40,114,42,129,45,137,0
¿Qué estoy haciendo mal y cómo solucionarlo? Noté que en mis datos hay filas en las que solo hay un número. ¿Puede ser esta la causa de mi problema? ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ PD Soy nuevo en redes neuronales y keras.
Nuevo
Aquí está df_train antes de procesar:
,x11,x21,x12,x22,x13,x23,x14,x24,x15,x25,x16,x26,x17,x27,x18,x28,x19,x29,x110,x210,x111,x211,x112,x212,x113,x213,114,214,115,x215,x116,x216,x117,x217,x118,x218,x119,x219,x120,x220,x121,x221,y 56,172,72,169,88,155,100,144,111,139,78,120,81,94,82,77,82,62,66,120,62,104,62,124,64,136,54,122,50,110,52,130,55,139,43,126,40,114,42,129,45,137,0 ... 84,166,96,158,108,143,108,131,101,127,87,145,87,128,90,118,94,111,74,147,76,119,81,114,84,115,64,148,66,120,72,119,74,124,56,148,57,124,61,124,63,129,5
Aquí está df_train después del procesamiento:
x11 x21 x12 x22 x13 x23 x14 ... x119 x219 x120 x220 x121 x221 y 0 56 175 73 168 88 155 101 ... 42 113 44 130 47 138 0.0 1 172 72 169 88 155 100 144 ... 114 42 129 45 137 0 0.0 2 172 72 169 88 155 100 144 ... 114 42 129 45 137 0 0.0 3 174 74 167 89 155 101 144 ... 115 44 130 46 137 0 0.0 4 174 74 169 90 155 101 144 ... 114 44 128 46 136 0 0.0 .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 843 166 96 158 108 143 108 131 ... 124 61 124 63 129 5 0.0 844 166 94 158 105 145 104 132 ... 128 58 130 59 134 5 0.0 845 164 90 155 101 141 100 129 ... 126 55 129 57 134 5 0.0 846 158 88 152 99 140 96 128 ... 142 54 150 58 146 5 0.0 847 158 88 152 99 140 96 128 ... 142 54 150 58 146 5 0.0
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
Probablemente esté utilizando la columna incorrecta como sus etiquetas, ya que todas son cero, lo que no tiene ningún sentido. Creo que deberías referirte a la penúltima columna, que tiene valores de 0 a 5 (6 clases). Aquí hay un ejemplo en ejecución:
import tensorflow as tf import pandas as pd df_train = pd.read_csv('/content/training_set.csv', skiprows=1, index_col=0) df_train = df_train.fillna(0) x_train = df_train.drop(['138.1', '0.1'], axis=1) y_train = df_train['138.1'] x_train = x_train / 310 y_train_cat = tf.keras.utils.to_categorical(y_train, 6) model = tf.keras.Sequential([tf.keras.layers.Dense(64, input_shape=(41,), activation='relu'), tf.keras.layers.Dense(32, activation='relu'), tf.keras.layers.Dense(6, activation='softmax')]) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train_cat, batch_size=16, epochs=9, validation_split=0.2) model.save("gestures_model.h5")
REV_CLASS_MAP = { 0: "up", 1: "down", 2: "right", 3: "left", 4: "forward", 5: "back" } def mapper(val): return REV_CLASS_MAP[val] df_test = pd.read_csv('/content/testing_set.csv', skiprows=1, index_col=0) df_test = df_test.fillna(0) x_test = df_test.drop(['140', '0.1'], axis=1) y_test = df_test['140'] model = tf.keras.models.load_model("/content/gestures_model.h5") predicted_list = model.predict(x_test) print(tf.argmax(predicted_list, axis=-1))
tf.Tensor( [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 1 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 1 1 0 0 4 4 4 0 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 1 1 1 3 4 4 4 4 1 1 1 4 1 1 1 4], shape=(599,), dtype=int64)
Este es solo un ejemplo para ilustrar lo que debería estar haciendo, obviamente debe ajustar su modelo y su parámetro.
Todas las filas necesitan el mismo tamaño de datos, por supuesto, algunos valores pueden estar vacíos en csv.
feature1, feature2, feature3,y aaa,bbb,3.0,2.0 bbb, ,4.1, 3.1
Debe imputar valores vacíos utilizando, por ejemplo, el valor más frecuente para valores categóricos o la mediana para valores numéricos. El valor previsto no puede estar vacío