Ответ 1
TL; DR: Проблема заключается в том, что ваши данные не перетасовываются, прежде чем разделяться на обучающие и валидационные наборы. Поэтому во время обучения все образцы, принадлежащие классу "sql" , находятся в наборе проверки. Ваша модель не научится прогнозировать последний класс, если в этом классе не были предоставлены образцы.
В get_input_and_labels()
сначала загружаются файлы для класса 0, а затем класс 1 и т.д. Поскольку вы устанавливаете n_max_files = 2000
, это означает, что
- Первый 2000 (или так, зависит от того, сколько файлов у вас есть) в
Y
будет иметь класс 0 ( "go" ) - Следующие 2000 записей будут иметь класс 1 ( "csharp" )
- ...
- и, наконец, последние 2000 записей будут иметь последний класс ( "sql" ).
К сожалению, Keras не перетасовывает данные, прежде чем разбивать их на тренировки и проверки. Поскольку в вашем коде validation_split
установлено значение 0,1, то последние 3000 выборок (которые содержат все образцы "sql" ) будут в наборе проверки.
Если вы установите validation_split
на более высокое значение (например, 0.2), вы увидите больше классов, скорректировавших 0%:
Final result: 12426/16016 (0.7758491508491508)
go: 926/1001 (0.9250749250749251)
csharp: 966/1001 (0.965034965034965)
java: 973/1001 (0.972027972027972)
js: 929/1001 (0.9280719280719281)
cpp: 986/1001 (0.985014985014985)
ruby: 942/1001 (0.9410589410589411)
powershell: 981/1001 (0.98001998001998)
bash: 882/1001 (0.8811188811188811)
php: 977/1001 (0.9760239760239761)
css: 988/1001 (0.987012987012987)
xml: 994/1001 (0.993006993006993)
python: 986/1001 (0.985014985014985)
scala: 896/1001 (0.8951048951048951)
clojure: 0/1001 (0.0)
fsharp: 0/1001 (0.0)
sql: 0/1001 (0.0)
Проблема может быть решена, если вы перетасовываете данные после загрузки. Кажется, что у вас уже есть строки, перетасовывающие данные:
# Shuffle data
shuffle_indices = np.random.permutation(np.arange(len(y)))
x_shuffled = x[shuffle_indices]
y_shuffled = y[shuffle_indices].argmax(axis=1)
Однако, когда вы подходите к модели, вы передавали исходные x
и Y
в fit()
вместо x_shuffled
и y_shuffled
. Если вы измените строку на:
model.fit(x_shuffled, y_shuffled, batch_size=batch_size,
epochs=num_epochs, validation_split=val_split, verbose=1)
Результаты тестирования станут более разумными:
Final result: 15248/16016 (0.952047952047952)
go: 865/1001 (0.8641358641358642)
csharp: 986/1001 (0.985014985014985)
java: 977/1001 (0.9760239760239761)
js: 953/1001 (0.952047952047952)
cpp: 974/1001 (0.973026973026973)
ruby: 985/1001 (0.984015984015984)
powershell: 974/1001 (0.973026973026973)
bash: 942/1001 (0.9410589410589411)
php: 979/1001 (0.978021978021978)
css: 965/1001 (0.964035964035964)
xml: 988/1001 (0.987012987012987)
python: 857/1001 (0.8561438561438561)
scala: 955/1001 (0.954045954045954)
clojure: 985/1001 (0.984015984015984)
fsharp: 950/1001 (0.949050949050949)
sql: 913/1001 (0.9120879120879121)