Разработка системы тестирования знаний студентов на основе нейронных сетей

Свойства биологического нейрона. Алгоритм обратного распространения ошибки. Обучение с учителем. Виды нейронных сетей и их свойства и преимущество. Разработка системы тестирования. Выбор программных средств для разработки. Структура базы данных и системы.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 07.08.2018
Размер файла 2,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

<button type="button" class="close" data-dismiss="alert" aria-hidden="true">Ч</button><b>Возникли ошибки</b><br>'.implode('<br>', $errors).'</div>';

}

После успешной авторизации пользователь попадает на страницу тестирования (рис. 3.4). На ней находится список всех доступных пользователю тестов.

Рис. 3.4 - Страница с выбором теста

После нажатия кнопки «Начать» пользователю последовательно задаются вопросы из теста (рис. 3.5). Имеется возможность пропустить вопрос, вернуться к предыдущему и завершить тест. По истечении времени тест также автоматически завершается.

Рис. 3.5 - Процесс тестирования

После завершения процесса тестирования, пользователю показывается его оценка за тест (рис. 3.6).

Рис. 3.6 - Результат тестирования

Скрипт testing.php, отвечает за процесс тестирования. В процессе тестирования мы извлекаем из БД вопрос, ответы на него, а также сохраняем результат ответа на предыдущий вопрос (с которого перешёл пользователь):

$qid = $_SESSION['qs'][$q];

$res = mysqli_query($link, "SELECT * FROM `questions` WHERE `id`='$qid'");

$question = mysqli_fetch_assoc($res);

$page['question'] = $question['text'];

$res = mysqli_query($link, "SELECT * FROM `answers` WHERE `id_question`='$qid'");

while ($arr = mysqli_fetch_assoc($res)) $page['answers'][] = $arr;

$qsid = $_SESSION['qs'][$saveq];// Saved qid

$res = mysqli_query($link, "SELECT * FROM `results` WHERE `id_report`='$_SESSION[cur_test]' AND `id_q`='$qsid'");

$answer_id = intval($_POST['answer']);

if (mysqli_num_rows($res) > 0) {

mysqli_query($link, "UPDATE `results` SET `id_ans`='$answer_id' WHERE `id_report`='$_SESSION[cur_test]' AND `id_q`='$qsid'");

} else {

mysqli_query($link, "INSERT INTO `results` VALUES(NULL, '$_SESSION[cur_test]', '$qsid', '$answer_id')");

}

$page['cur'] = mysqli_fetch_assoc(mysqli_query($link, "SELECT * FROM `results` WHERE `id_report`='$_SESSION[cur_test]' AND `id_q`='$qid'"));

Также тут проходит и расчет оценки за тест. В случае, если для теста выбран режим «Ручной», мы считываем значения весовых коэффициентов из БД. Если выбран режим «Авто», то используется нейронная сеть обученная по результатам предыдущих тестов. Оценка определяется по значениям выходных нейронов последнего слоя.

if (isset($_POST['endtest'])) {

$time = time();

mysqli_query($link, "UPDATE `reports` SET `time_end`='$time' WHERE `id`='$_SESSION[cur_test]'");

if ($test['type'] == 0 || !file_exists("fann/test_$test[id].net")) {// Ставим оценку по результатам работы сети с вручную выставленными весами

include 'inc/nn_calc.php';

$prc = round(run_result($link, $_SESSION['cur_test'], false) / run_result($link, $_SESSION['cur_test'], true) * 100);

$page['dmark'] = 2;

if ($prc > 50) $page['dmark']++;

if ($prc > 70) $page['dmark']++;

if ($prc > 90) $page['dmark']++;

} else { // Ставим оценку по результатам, которые отдала обученная нейросеть

$res = mysqli_query($link, "SELECT `id_q` FROM `tests_q` WHERE `id_test`='$test[id]'");

while ($arr = mysqli_fetch_assoc($res)) {

$ids[] = $arr['id_q'];

}

$res2 = mysqli_query($link, "SELECT `results`.`id_q`, `answers`.`mark` FROM `results` LEFT JOIN `answers` ON (results.id_ans=answers.id) WHERE id_report = '$_SESSION[cur_test]'");

$ans = array();

while ($arr2 = mysqli_fetch_assoc($res2)) {

$ans[$arr2['id_q']] = $arr2['mark'];

}

$fann_in = array();

for ($i = 0; $i < count($ids); $i++) {

if (isset($ans[$ids[$i]])) $fann_in[] = $ans[$ids[$i]].' '; else $fann_in[] = 0;

}

$ann = fann_create_from_file("fann/test_$test[id].net");

if ($ann) {

$calc_out = fann_run($ann, $fann_in);

fann_destroy($ann);

$index_max = 0;

$max = -1;

for ($i = 0; $i < 4; $i++) {

if ($calc_out[$i] > $max) {

$index_max = $i;

$max = $calc_out[$i];

}

}

$page['dmark'] = 2;

if ($index_max == 1) $page['dmark'] = 3;

if ($index_max == 2) $page['dmark'] = 4;

if ($index_max == 3) $page['dmark'] = 5;

} else {

echo "Invalid file format";

}

}

mysqli_query($link, "UPDATE `reports` SET `mark`='$page[dmark]' WHERE `id`='$_SESSION[cur_test]'");

}

unset($_SESSION['cur_test']);

Функция расчёта оценки по результатам теста из файла inc/nn_calc.php:

function run_result($link, $id, $max = false) {

$res = mysqli_query($link, "SELECT `id_test` FROM `reports` WHERE `id`='$id'");

$arr = mysqli_fetch_row($res);

$tid = $arr[0];// ИД теста

$res = mysqli_query($link, "SELECT `tests_q`.`id_q`, `weights`.`to`, weights.value FROM `tests_q` LEFT JOIN `weights` ON(tests_q.id_q=weights.from) WHERE `id_test`='$tid'");

$weights_hidden = array();

while ($arr = mysqli_fetch_assoc($res)) {

$connect = array('from' => $arr['id_q'], 'value' => $arr['value']);

$weights_hidden[$arr['to']][] = $connect;

}

$layer_in = array();

$res = mysqli_query($link, "SELECT `results`.*, `answers`.`mark` FROM `results` LEFT JOIN `answers` ON (results.id_ans=answers.id) WHERE id_report='$id'");

while ($arr = mysqli_fetch_assoc($res)) {

$layer_in[$arr['id_q']] = $arr['mark'];

}

foreach ($weights_hidden as $theme => $connect) {

for ($i = 0; $i < count($connect); $i++) {

$value_in = (isset($layer_in[$connect[$i]['from']]) ? $layer_in[$connect[$i]['from']]: 0);

if ($max) $value_in = 1;

$layer_hidden[$theme] += $connect[$i]['value']*$value_in;

}

}

$result = 0;

foreach($layer_hidden as $theme=>$value) {

$res = mysqli_query($link, "SELECT `weight` FROM `themes` WHERE `id`='$theme'");

$arr = mysqli_fetch_row($res);

$weight = $arr[0];

$result += $value*$weight;

}

return $result;

}

На странице управления пользователями (рис. 3.7.) администратор системы имеет возможность управлять пользователями: осуществлять поиск как по ФИО, так и по логину; просматривать весь список доступных пользователей; добавлять новых; удалять; редактировать информацию (в т.ч. менять пароль) пользователя.

Отображение списка пользователей происходит следующим способом: сначала проверяется поле для поиска и выводятся пользователи, попадающие под условие или, если поле не заполнено, выполняется вывод всех пользователей из БД. При этом их количество ограничено двадцатью и выполняется разбивка списка по страницам (смещение в списке задается через переменную $offset и выражения LIMIT в команде SELECT - оно используется для ограничения количества строк).

if ($act == 'search' && !empty($_POST['user'])) {

$user = checkin($link, $_POST['user']);

$user = str_replace(' ', '%', $user);

$res = mysqli_query($link, "SELECT COUNT(*) FROM `users` WHERE (`login` LIKE '%$user%') OR (`name` LIKE '%$user%')");

$arr = mysqli_fetch_row($res);

$page['total'] = $arr[0];

if ($page['total'] == 0) {

$page['message'] = '<div class="alert alert-dismissable alert-info"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">Ч</button>Такой пользователь не найден</div>';

}

$res = mysqli_query($link, "SELECT `id`, `login`, `type`, `name`, `note` FROM `users` WHERE (`login` LIKE '%$user%') OR (`name` LIKE '%$user%')");

} else {

$res = mysqli_query($link, 'SELECT COUNT(*) FROM `users`');

$arr = mysqli_fetch_row($res);

$page['total'] = $arr[0];

$res = mysqli_query($link, "SELECT `id`, `login`, `type`, `name`, `note` FROM `users` LIMIT $offset, 20");

}

while ($arr = mysqli_fetch_assoc($res)) $page['users'][] = $arr;

Рис. 3.7 - Отображение списка пользователей

Внизу страницы (рис. 3.8) реализована форма для добавления пользователя. Заполняются следующие поля: логин, пароль, тип пользователя, ФИО, заметка (последние два не обязательны).

После нажатия кнопки «Создать» проходит проверка всех введённых данных, если всё правильно заполнено, то пользователь добавится в систему:

$login = checkin($link, $_POST['login']);

$password = checkin($link, $_POST['password']);

$type = intval($_POST['type']);

$name = checkin($link, $_POST['name']);

$note = checkin($link, $_POST['note']);

if (mb_strlen($login) < 2 || mb_strlen($login) > 20) {

$errors[] = 'Логин должен содержать от 2 до 20 символов';

}

if (preg_match('/[^\dA-z\-\_\.]+/', $login)) {

$errors[] = 'Логин может содержать только символы латинского алфивита, цифры, а также:. _ -';

}

if (mb_strlen($password) < 6) {

$errors[] = 'Минимальная длина пароля 6 символов';

}

if ($type < 1 || $type > 2) {

$errors[] = 'Выбран несуществующий тип пользователя';

}

if (mb_strlen($name) > 255) {

$errors[] = 'Максимальная длина поля ФИО - 255 символов';

}

if (mb_strlen($note) > 255) {

$errors[] = 'Максимальная длина заметки - 255 символов';

}

if (empty($errors)) {

$res = mysqli_query($link, "SELECT * FROM `users` WHERE `login`='$login'");

if (mysqli_num_rows($res) > 0) {

$errors[] = 'Пользователь с таким логином уже существует';

}

}

if (empty($errors)) {

$password = hash('SHA256', md5($password));

$res = mysqli_query($link, "INSERT INTO `users` VALUES(NULL, '$login', '$password', '$type', '$name', '$note')");

if ($res) {

$page['message'] = '<div class="alert alert-dismissable alert-info"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">Ч</button>Пользователь добавлен!</div>';

} else {

exit(mysqli_error($link));

}

} else {

$page['message'] = '<div class="alert alert-dismissable alert-danger"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">Ч</button><b>Возникли ошибки</b><br>'.implode('<br>', $errors).'</div>';

}

Переменная $array - это массив ошибок. При проверке каждого из полей, если оно не удовлетворяет условиям, в массив добавляется новый элемент - строку, содержащую текст ошибки. Пользователь добавляется в базу данных только тогда, когда по окончании всех проверок массив останется пустым.

Рис. 3.8 - Форма добавления нового пользователя

Страница с отчетами (рис. 3.9) содержит оценки всех пользователей, прошедших выбранный тест, а также время начала и завершения теста (для преподавателя и администратора), или, оценки одного пользователя по всем тестам (если это студент).

Для студента выборка данных из БД происходит следующим образом:

$res = mysqli_query($link, "SELECT `reports`.*, `tests`.`name` FROM `reports` INNER JOIN `tests` ON reports.id_test=tests.id WHERE `id_user`='$_SESSION[id]'");

while ($arr=mysqli_fetch_assoc($res)) {$page['reports'][] = $arr;}

Для преподавателей и администратора, аналогичным образом выводятся сначала тесты, а затем, при выборе одного из них и оценки всех пользователей.

Рис. 3.9 - Просмотр результатов теста

Для преподавателей и администратора имеется возможность просмотреть ответы на вопросы конкретного пользователя на выбранном тесте, увидеть процент выполнения теста в общем и по темам, а также изменить его оценку за тест, если результат работы нейронной сети и автоматического выставления ею оценки оказался неверным.

Просмотр подробного результата (рис.3.10) по темам происходит следующим образом: сначала на вход нейронной сети подается вектор входных сигналов (ответы на вопросы), потом результаты входного слоя передаются на второй слой, отвечающий за принадлежность вопросов темам. Результат работы нейронов со второго слоя и есть результат теста по темам.

Рис. 3.10 - Просмотр результата теста

Реализовано это в файле inc/nn_calc.php следующей функцией:

Расчёт предполагаемой оценки и возврат результатов на скрытом слое (по темам)

function run_layer($link, $id, $max = false) {

$res = mysqli_query($link, "SELECT `id_test` FROM `reports` WHERE `id`='$id'");

$arr = mysqli_fetch_row($res);

$tid = $arr[0];// ИД теста

$res = mysqli_query($link, "SELECT `tests_q`.`id_q`, `weights`.`to`, weights.value FROM `tests_q` LEFT JOIN `weights` ON(tests_q.id_q=weights.from) WHERE `id_test`='$tid'");

$weights_hidden = array();

while ($arr = mysqli_fetch_assoc($res)) {

$connect = array('from' => $arr['id_q'], 'value' => $arr['value']);

$weights_hidden[$arr['to']][] = $connect;

}

$layer_in = array();

$res = mysqli_query($link, "SELECT `results`.*, `answers`.`mark` FROM `results` LEFT JOIN `answers` ON (results.id_ans=answers.id) WHERE id_report='$id'");

while ($arr = mysqli_fetch_assoc($res)) {

$layer_in[$arr['id_q']] = $arr['mark'];

}

foreach ($weights_hidden as $theme => $connect) {

for ($i = 0; $i < count($connect); $i++) {

$value_in = (isset($layer_in[$connect[$i]['from']]) ? $layer_in[$connect[$i]['from']]: 0);

if ($max) $value_in = 1;

$layer_hidden[$theme] += $connect[$i]['value']*$value_in;

}

}

return $layer_hidden;

}

Изменение оценки производится в форме внизу страницы (рис. 3.11).

Рис. 3.11 - Изменение оценки

На странице «Мои предметы» (рис. 3.12) пользователь может просмотреть, добавить новые, изменить или удалить существующие предметы (дисциплины). Нужное действие следует выбрать, нажав на значок в колонке «Действие». Для перехода к темам (рис. 3.13) следует нажать на название предмета.

Рис. 3.12 Просмотр списка предметов

Рис. 3.13 - Список тем в выбранной дисциплине

Страница «Управление вопросами» (рис. 3.14) служит для добавления, удаления, редактирования вопросов в выбранной дисциплине. Для выбора нужного действие следует нажать на соответствующую пиктограмму.

Рис. 3.14 - Просмотр списка вопросов в этой дисциплине

Добавление нового вопроса и ответов на него доступно в форме внизу страницы. Добавление ответов к вопросу в форме, а также принадлежность вопроса к какой-либо теме происходит с помощью JavaScript скрипта динамически при нажатии соответствующей кнопки:

<script type="text/javascript">

function addAns() {

var form_answer = '\

<div class="form-group"> \

<label class="col-md-3 control-label">Ответ: </label> \

<div class="col-md-5"> \

<input class="form-control" name="answer[]" placeholder="вариант ответа" type="text"> \

</div> \

<label class="col-md-2 control-label">Балл за ответ: </label> \

<div class="col-md-2"> \

<input class="form-control" name="mark[]" placeholder="от 0 до 1" type="text"> \

</div> \

</div>';

$('#AnsFields').append(form_answer);

}

function addTheme() {

var form_theme = '\

<div class="form-group"> \

<label class="col-md-3 control-label">Выберите тему: </label> \

<div class="col-md-5"> \

<select class="form-control" name="theme[]"><? for ($i = 0; $i < count($page['themes']); $i++) echo '<option value="'.$page['themes'][$i]['id'].'">'.$page['themes'][$i]['name'].'</option>'; ?></select> \

</div> \

<label class="col-md-2 control-label">Вес связи: </label> \

<div class="col-md-2"> \

<input class="form-control" name="weight[]" placeholder="от 0 до 1" type="text"> \

</div> \

</div>';

$('#ThemesFields').append(form_theme);

}

</script>

<form class="form-horizontal well" method="POST" action="?act=add&subid=<? echo $page['subid']; ?>">

<fieldset>

<legend>Добавление:</legend>

<div class="form-group">

<label class="col-md-3 control-label">Текст вопроса:</label>

<div class="col-md-9">

<textarea class="form-control" rows="3" name="question" placeholder=""></textarea>

</div>

</div>

<div id="AnsFields"></div>

<div class="col-md-9 col-md-offset-3"><a href="#" onClick="addAns()">Добавить вариант ответа</a></div><br>

<div id="ThemesFields"></div>

<div class="col-md-9 col-md-offset-3"><a href="#" onClick="addTheme()">Добавить привязку к теме</a></div><br>

<div class="form-group">

<div class="col-md-9 col-md-offset-3">

<button type="reset" class="btn btn-default">Отмена</button>

<button type="submit" class="btn btn-primary">Создать</button>

</div>

</div>

</fieldset>

</form>

Обработка данных с формы на сервере происходит следующим образом: сначала в БД добавляется вопрос и сразу же получаем его идентификатор, потом в цикле проходим по всем полям формы. Данные с формы будут находится в массивах $_POST[`answer'], $_POST[`mark'], $_POST[`theme'] и $_POST[`weight']:

$q = checkin($link, $_POST['question']);

mysqli_query($link, "INSERT INTO `questions` VALUES(NULL, '$subid', '$q')");

$lastid = mysqli_insert_id($link);

for ($i = 0; $i < count($_POST['answer']); $i++) {

$answer = checkin($link, $_POST['answer'][$i]);

$mark = doubleval($_POST['mark'][$i]);

mysqli_query($link, "INSERT INTO `answers` VALUES(NULL, '$lastid', '$answer', '$mark')");

}

for ($i = 0; $i < count($_POST['theme']); $i++) {

$theme= checkin($link, $_POST['theme'][$i]);

$weight = doubleval($_POST['weight'][$i]);

mysqli_query($link, "INSERT INTO `weights` VALUES(NULL, '$lastid', '$theme', '$weight')");

}

Редактирование вопроса происходит в той же форме и аналогично добавлению (рис. 3.15).

На странице со списком тестов (рис. 3.16) при нажатии на пиктограмму редактирования, можно перейти к изменению выбранного текста: поддерживается изменение всех полей существующего теста, а также добавление новых вопросов к тесту.

Рис. 3.15 - Редактирование вопроса

Рис. 3.16 - Редактирование теста

Выборка списка тестов из базы данных, а также списка доступных вопросов для добавления в тест происходит следующим образом:

$res = mysqli_query($link, "SELECT * FROM `tests` WHERE `id_subject`='$subid'");

while ($arr=mysqli_fetch_assoc($res)) {

$page['tests'][] = $arr;

}

$res = mysqli_query($link, "SELECT `name` FROM `subjects` WHERE `id`='$subid'");

$arr = mysqli_fetch_assoc($res);

$page['text'] = $arr['name'];

$res = mysqli_query($link, "SELECT * FROM `questions` WHERE `id_subject`='$subid'");

while ($arr=mysqli_fetch_assoc($res)) {

$page['questions'][] = $arr;

}

Добавление новых элементов на форму (выпадающий список) выполнено с помощью JavaScript:

<script type="text/javascript">

function addQ() {

var form_q = '\

<div class="form-group"> \

<label class="col-md-3 control-label">Выберите вопрос: </label> \

<div class="col-md-9"> \

<select class="form-control" name="q[]">

<?

for ($i = 0; $i < count($page['questions']); $i++)

echo '<option value="'.$page['questions'][$i]['id'].'">'.$page['questions'][$i]['text'].'</option>';

?>

</select> \

</div> \

</div>';

$('#QFields').append(form_q);

}

</script>

Добавление вопроса происходит при нажатии по соответствующей ссылке:

<form class="form-horizontal well" method="POST" action="?act=edit&subid=<? echo $subid.'&id='.$id; ?>">

<fieldset>

<legend>Редактирование теста:</legend>

<div class="form-group">

<label class="col-md-3 control-label">Название теста:</label>

<div class="col-md-9">

<input class="form-control" placeholder="макс. 255 символов" type="text" name="name" value="<? echo $page['test']['name']; ?>">

</div>

</div>

<div class="form-group">

<label class="col-md-3 control-label">Тип:</label>

<div class="col-md-9">

<div class="radio">

<label>

<input value="0" <? echo ($page['test']['type'] == 0 ? 'checked=""': ''); ?> type="radio" name="type" />Ручной (использование выставленных весов)

</label>

</div>

<div class="radio">

<label>

<input value="1" <? echo ($page['test']['type'] == 1 ? 'checked=""': ''); ?> type="radio" name="type" />Авто (обучение по результатам теста)

</label>

</div>

</div>

</div>

<div class="form-group">

<label class="col-md-3 control-label">Вопросы в случайном порядке:</label>

<div class="col-md-9">

<div class="radio">

<label>

<input value="1" <? echo ($page['test']['random'] == 1 ? 'checked=""': ''); ?> checked="" type="radio" name="random" />Да

</label>

</div>

<div class="radio">

<label>

<input value="0" <? echo ($page['test']['random'] == 0 ? 'checked=""': ''); ?> type="radio" name="random" />Нет

</label>

</div>

</div>

</div>

<div class="form-group">

<label class="col-md-3 control-label">Время на весь тест:</label>

<div class="col-md-9">

<input class="form-control" placeholder="в минутах" type="text" name="time" value="<? echo $page['test']['time']; ?>">

</div>

</div>

<div id="QFields">

<?

for ($i = 0; $i < count($page['q']); $i++) {

echo '<div class="form-group">

<label class="col-md-3 control-label">Выберите вопрос: </label>

<div class="col-md-9">

<select class="form-control" name="q[]">';

for ($j = 0; $j < count($page['questions']); $j++) {

echo '<option value="'.$page['questions'][$j]['id'].'" '.($page['q'][$i]['id_q'] == $page['questions'][$j]['id'] ? 'selected': '').'>'.$page['questions'][$j]['text'].'</option>';

}

echo'</select>

</div>

</div>';

}

?>

</div>

<div class="col-md-9 col-md-offset-3">

<a href="#" onClick="addQ()">Добавить вопрос</a>

</div>

<br>

<div class="form-group">

<div class="col-md-9 col-md-offset-3">

<button type="reset" class="btn btn-default">Отмена</button>

<button type="submit" class="btn btn-primary" name="save">Сохранить</button>

</div>

</div>

</fieldset>

</form>

После того как пользователи несколько десятков раз прошли какой-либо тест и преподаватель изменил (поправил) некоторые оценки (в разделе «Отчеты»), нейронную сеть можно обучить выставлять оценки по существующим примерам (обучающей выборке). Для этого следует нажать на соответствующую иконку и перейти в параметры обучения нейронной сети (рис. 3.17). Параметры по умолчанию рекомендованы для использования, т.к. на практике сеть с такими параметрами при обучении на выборке в 35 примеров уже может корректно выставлять результаты студентам, также обучение происходит почти мгновенно (около 1 - 2 секунд).

Для обучения нейронной сети использовалась библиотека FANN. Перед обучением подготавливалась обучающая выборка, примеры для неё загружались из базы данных (результаты тестирования студентов). Функции обучения FANN на вход подавался файл, содержащий баллы за отвеченные вопросы, и вектор, содержащий оценки за тест (четыре значение от 2 до 5). Пример из сформированного файла:

0.3 0 1 1 1 1 1 1 1 1

0 0 1 0

Рис. 3.17 - Обучение нейронной сети

Первая строка содержит оценки за каждый из вопросов в тесте, вторая - активированный нейрон, отвечающий за оценку. В данном случае на все вопросы (кроме 1 и 2) были даны верные ответы, на первый частично верный и на второй ответ был не правильный. 3-е число во второй строке указывает на то, что за тест была поставлена четверка.

Использование FANN:

$ann = fann_create_standard($layers, $input, $hidden, $out);

if ($ann) {

fann_set_activation_function_hidden($ann, FANN_SIGMOID_SYMMETRIC);

fann_set_activation_function_output($ann, FANN_SIGMOID_SYMMETRIC);

$fres = fann_train_on_file($ann, "fann/test_$id.data", $epochs, 1000, $mse);

if ($fres) {

fann_save($ann, "fann/test_$id.net");

}

fann_destroy($ann);

} else {

echo 'Произошла ошибка при инициализации FANN';

}

После обучения сети, её конфигурация сохраняется в папке fann/.

Заключение

нейрон сеть программный тестирование

В результате выполнения данной бакалаврской работы была разработана система тестирования знаний студентов на основе нейронных сетей.

В процессе разработки были исследованы различные материалы по искусственным нейронным сетям. Разработана математическая модель для системы оценки качества знаний.

Были описаны процессы работы с СУБД MySQL, используемой библиотекой нейронных сетей - FANN, программирование на языке php, использование php-fann, использование технологий html, css, JavaScript, Bootstrap, jQuery. В общей сложности было написано 28 php скриптов.

Поставленные задачи дипломной работы были в полной мере реализованы в соответствии с заданием.

Практическая ценность дипломной работы заключается в использовании разработанной системы в образовательном процессе кафедры Информационных систем и технологий.

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.