Необъяснимая разница в результатах для вложенных списков скрытых слоев ⇐ Python

Программы на Python
Anonymous
Необъяснимая разница в результатах для вложенных списков скрытых слоев

Сообщение Anonymous »

Я создал собственную модель Tensorflow с помощью API подклассов. Модель имеет 3 плотных MLP параллельно (по 4 скрытых слоя в каждом) и один выход на каждый MLP. Они никак не связаны. Я знаю, что мне нужно просто построить 3 отдельные модели, но я хотел попробовать что-то новое.
Я создаю свои скрытые слои как вложенный список, то есть список MLP, каждый из которых содержит другой. список скрытых слоев. Кажется, моя проблема связана с тем, как я создаю этот вложенный список, как показано ниже:

Код: Выделить всё

def __init__(self):
super().__init__()

# units is a list of integers denoting the number of units per layer
# activation is a list of str denoting the activation function of each layer
# nMLP is the number of parallel MLPs

# Create layers
self.units = [5,5,5,5]
self.activation = ['relu','relu','relu','relu']
self.nlayer = len(self.units)
self.nMLP = 3

# DOES NOT WORK #
# self.layer_hidden = [
#     [
#         [] for _ in range(self.nlayer)
#     ] for _ in range(self.nMLP)
# ]
# for iMLP in range(self.nMLP):
#     for ilayer, (nunits, act) in enumerate(zip(self.units, self.activation)):
#         self.layer_hidden[iMLP][ilayer] = Dense(units=nunits, activation=act)

# WORKS #
self.layer_hidden = [
[
Dense(units=nunits, activation=act) for nunits, act in zip(units, activation)
] for _ in range(self.nMLP)
]
Я могу создать вложенный список либо с помощью вложенных циклов, либо с помощью понимания вложенного списка. Оба кажутся мне эквивалентными, и когда я запрашиваю модель после построения, они оба имеют одинаковую форму, например (нМЛП, нслой). Они также не являются копиями ссылок, указывающих на один и тот же объект, поэтому каждый элемент уникален.
Однако при обучении подход с вложенным циклом приводит к очень большому количеству ошибок и не сходится. , в то время как подход к пониманию вложенных списков прекрасно сходится и способен точно предсказать данные. Я изолировал его в этом фрагменте кода, просто закомментировав любой раздел и переобучив модель.
Оба подхода к динамическому созданию слоев действительны для одного списка слоев (не вложенных). Но по какой-то причине вложение приводит к этой проблеме. В других сообщениях о динамическом создании слоев также рекомендуются оба подхода: Как создать динамическое количество слоев в Tensorflow?
Я реализовал метод build_graph(): Как построить график Keras/Tensorflow подклассификация модели API? чтобы визуализировать структуру моего графа, и оба они эквивалентны и правильны.
Я что-то упускаю?

Подробнее здесь: https://stackoverflow.com/questions/790 ... den-layers

Вернуться в «Python»