Nano Hash - криптовалюты, майнинг, программирование

Программирование архитектуры нейронной сети с несколькими входами с помощью Keras

Я хочу запрограммировать нейронную сеть и использую для этого библиотеку Keras. Один набор данных делится на случайное количество подмножеств (1-100). Неиспользуемые подмножества обнуляются. Одно подмножество состоит из 2*4+1 двоичных входных значений. Архитектура должна выглядеть следующим образом (веса всех подмножеств сетей должны быть общими):

.   InA1(4) InB1(4)   _
.       \     /        \
.     FCNA  FCNB       |
.         \ /          |
.      Concatinate     |
.          |           \ 100x (InA2, InB2, InC2, InA3, ...)
.         FCN          /
.InC(1)    |           |
.     \   /            |
.      \ /            _/
.  Concatinate
.       |
.      FCN
.       |
.     Out(1)

Я просмотрел несколько руководств и примеров, но не нашел подходящего метода для реализации этой сети. Вот что я пробовал до сих пор:

from keras import *

# define arrays for training set input
InA = []
InB = []
InC = []
for i in range(100):
    InA.append( Input(shape=4,), dtype='int32') )
    InB.append( Input(shape=4,), dtype='int32') )
    InC.append( Input(shape=1,), dtype='int32') )

NetA = Sequential()
NetA.add(Dense(4, input_shape(4,), activation="relu"))
NetA.add(Dense(3, activation="relu"))

NetB = Sequential()
NetB.add(Dense(4, input_shape(4,), activation="relu"))
NetB.add(Dense(3, activation="relu"))

NetMergeAB = Sequential()
NetMergeAB.add(Dense(1, input_shape=(3,2), activation="relu"))

# merging all subsample networks of InA, InB
MergeList = []
for i in range(100):
    NetConcat = Concatenate()( [NetA(InA[i]), NetB(InB[i])] )
    MergedNode = NetMergeAB(NetConcat)
    MergeList.append(MergedNode)
    MergeList.append(InC[i])

# merging also InC
FullConcat = Concatenate()(MergeList)

# put in fully connected net
ConcatNet = Sequential()
ConcatNet.add(Dense(10, input_shape(2, 100), activation="relu"))
ConcatNet.add(Dense(6, activation="relu"))
ConcatNet.add(Dense(4, activation="relu"))
ConcatNet.add(Dense(1, activation="relu"))

Output = ConcatNet(FullConcat)

Проблема в том, что либо я получаю ошибку «нет тензора», либо он вообще не работает. Кто-нибудь знает, как это правильно решить?


Ответы:


1

Используя код из ответа автора вопроса:

ActInA = Input(shape=(4,), dtype='int32')
ActInB = Input(shape=(4,), dtype='int32')
ActInC = Input(shape=(1,), dtype='int32')

NetA = Dense(4, activation="relu")(ActInA)
NetA = Dense(3, activation="relu")(NetA)

NetB = Dense(4, activation="relu")(ActInB)
NetB = Dense(3, activation="relu")(NetB)

NetAB = concatenate([NetA, NetB])
NetAB = Dense(1, activation="relu")(NetAB)

Теперь мы строим модель для этого подмножества сети:

mymodel = Model([ActInA, ActInB], NetAB)

Теперь важная часть из документа Keras:

Все модели можно вызывать, как и слои.

это означает, что вы можете просто сделать что-то вроде этого:

for i in range(100):
   NetMergeABC.append(mymodel([ActInA_array[i], ActInB_array[i]]))

Поскольку вы повторно используете слои, веса будут общими.

18.06.2018

2

Вы можете легко создать такую ​​сетевую архитектуру с помощью функционального API и не использовать Sequential вообще:

InA, InB, InC = [Input(shape=(4,), dtype='int32') for _ in range(3)]

netA = Dense(4, activation="relu")(InA)
netA = Dense(3, activation="relu")(netA)

netB = Dense(4, activation="relu")(InB)
netB = Dense(3, activation="relu")(netB)

netMergeAB = concatenate([netA, netB])
netMergeAB = Dense(1, activation="relu")(netMergeAB)

fullConcat = concatenate([netMergeAB, InC])

out = Dense(10, activation="relu")(fullConcat)
out = Dense(6, activation="relu")(out)
out = Dense(4, activation="relu")(out)
out = Dense(1, activation="relu")(out)

model = Model([InA, InB, InC], out)

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

15.06.2018
  • Спасибо за Ваш ответ. Ваш код работает, но это не совсем то, что мне нужно, потому что есть только одна сеть A, B и C. 18.06.2018

  • 3

    Я изменил свой код и надеюсь, что теперь он более понятен:

    NetMergeABC = []
    for i in range(100):
        ActInA = Input(shape=(4,), dtype='int32')
        ActInB = Input(shape=(4,), dtype='int32')
        ActInC = Input(shape=(1,), dtype='int32')
    
        NetA = Dense(4, activation="relu")(ActInA)
        NetA = Dense(3, activation="relu")(NetA)
    
        NetB = Dense(4, activation="relu")(ActInB)
        NetB = Dense(3, activation="relu")(NetB)
    
        NetAB = concatenate([NetA, NetB])
        NetAB = Dense(1, activation="relu")(NetAB)
        NetMergeABC.append(NetAB)
        NetMergeABC.append(ActInC)
    
    NetABC = concatenate(NetMergeABC)
    NetABC = Dense(10, activation="relu")(NetABC)
    NetABC = Dense(6, activation="relu")(NetABC)
    NetABC = Dense(4, activation="relu")(NetABC)
    NetABC = Dense(1, activation="relu")(NetABC)
    

    Проблема сейчас в том, что (я думаю) веса NetA/B/C 1-100 не распределяются.

    18.06.2018
  • Хорошо, я нашел решение: возьмите приведенный выше код и создайте последовательную модель NetA, NetB и NetMergeAB перед циклом. Затем в цикле вызовите последовательные модели вместо создания новых плотных слоев. 18.06.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..