Как стать автором
Обновить

Комментарии 7

А какой смысл в этой надстройке, если сам gonn заброшен и последний коммит там 9 лет назад?

Я бы сказал не заброшен, а закончен. А Вас не смущает, что таблица умножения не обновлялась уже более 2-х тысяч лет и все равно ей продолжают пользоваться?

не заброшен, а закончен

Закончен, но с TODO большими буквами на главной странице README?

Ну и просто для справки, помимо описанных в gonn

BackPropagation Network / RBF Network / Perceptron Network

Есть еще много чего еще, например, Convolutional NN (1d, 2d, 3d, etc.), Recurrent NN (rnn, lstm, gru, etc.), Graph NN (gcnn, graphsage, etc.), Transformers и т.д. Конференции типа NIPS, где каждый год представляют что-то новое, являются одними из самых посещаемых... Так что сравнение про таблицу умножения звучит странно.

Семен, я полностью с вами согласен, что в области машинного обучения очень много нового, и очень много людей этим интересуется. Я не хотел вас обидеть своим комментарием про "таблицу умножения" :-)

Во вступлении я написал, что статья больше подходит для тех кто хочет начать использовать машинное обучение в своих проектах на Go, а не для тех кто уже все понял.

Мне кажется, что если мы свалим на человека кучу непонятных терминов и названий, то он отложит эту тему ещё на год :-)

Пакет gonn хорошо справляется с описанной в стате задачами, шустро работает, имеет небольшой размер и не тянет за собой зависимостей.

Мне кажется, что читателю, с помощью nnhelper, будет легко и удобно начать использовать нейросети в своих проектах на Go. В случае необходимости всегда можно взять что-то более сложное.

Мне удобно пользоваться nnhelper, я делюсь этим удобством с читателем.

Спасибо!

Тема интересная, но мне бы хотелось чуть больше вводной информации. Не подскажете какой-нибудь толковый источник по нейросетям для чайников?
Посмотрел ваш пакет, и могу сказать, что даже если у вас всё ОК по части нейросетей, то сам пакет оставляет желать лучшего.

Например,

// ReadCsvFile read csv file and return float array
func ReadCsv(filePath string) (out [][]float64, err error) {
	csv, err := ReadCsvFile(filePath)
	if err != nil {
		return
	}

Если была ошибка при чтении файла, тут вместо неё вернётся nil.
В вызывающем коде похожая ситуация:

	input, _ := ReadCsv(inpupCsv)
	if len(print) > 0 && print[0] {

Ошибка вообще игнорируется.
Надо работать над качеством!

У меня нет под рукой ссылки на что-то совем вводное по нейросетям. Мне кажется эта информация доступна в сети. Если мне попадётся что-то простое, понятное и с вводной информацией, я обязательно Вам пришлю ссылку.

Извените, Дмитрий, но я не вижу ошибки, о которой вы говорите, в функции "ReadCsvFile read csv file and return float array". Вот, добавил к проекту тест этой функции в файле csv_test.go:

// Reading existing csv file
func TestReadCsvFile(t *testing.T) {
	_, err := ReadCsvFile("examples/sam01/sam01_inp.csv")
	if err != nil {
		t.Errorf("Can't read csv file, error = %s; want nil", err.Error())
		return
	}
}

// Reading non-existing csv file
func TestReadCsvFile2(t *testing.T) {
	_, err := ReadCsvFile("examples/sam01/sam01_inp_notexists.csv")
	if err == nil {
		t.Errorf("Does not return error when read not existing csv file, "+
			"error = %v", err)
		return
	}
}

И оба теста проходят. Первый тест читает существующий файл, второй тест читает несуществующий файл.

Спасибо.

Да, код некрасивый, но конкретно в той части рабочий.

В любом случае, пустой return который возвращает массив, определённый в заголовке, и затенённую ошибку - это классический пример плохого кода на Go.

Хотя с учётом игнорирования ошибки в вызывающем коде, это, конечно, и не важно.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.