When recognizing hand gesture classes, I always get the same class, although I tried changing the parameters and even passed the data without normalization:
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")
Here is a main code:
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)
Here is an example of input data:
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
What am I doing wrong and how to fix it? I noticed that in my data there are rows in which there is only one number. Could this be the cause of my problem? ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ P.S I am new to neural networks and keras.
New
Here is df_train before processing:
,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
Here is df_train after processing:
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
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
You are probably using the wrong column as your labels, since they are all zero, which does not make any sense. I think you should be referring to the second last column, which has values from 0 to 5 (6 classes). Here is a running example:
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)
This just an example to illustrate what you should be doing, you should obviously tune your model and its parameter.
All rows need the same data size, of course some values can be empty in csv.
feature1, feature2, feature3,y
aaa,bbb,3.0,2.0
bbb, ,4.1, 3.1
You need to impute empty values by using for example most frequent value for categorical values or median for numerical values. Predicted value cant be empty