Нейронная сеть внутри цикла for

У меня есть что-л.

for q in range(10):
   # generate some samples
   x = Input(batch_shape=(n_batch, xx.shape[1]))
   x = Dense(20)(x)
   x = LeakyReLU(alpha=0.001)(x)
   y = Dense(1)(x)
   y = LeakyReLU(alpha=0.001)(y)
   model = Model(inputs=x, outputs=y) 
   model.compile(loss='mean_squared_error', optimizer='Adam', metrics=['accuracy'])
   for i in range(10):
      model.fit(x, y, epochs=1, batch_size=n_batch, verbose=0, shuffle=False)
      model.reset_states()

Интересно, создается ли нейронная сеть с нуля для каждого q или она сохраняет все из предыдущего q? Если он сохраняется, как мне сбросить и построить, скомпилировать и подогнать нейронную сеть отдельно для каждого q?

1
0
133
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Когда вы вызываете model.fit(), тензорный поток выполняет свой график, начиная с корня. Если вы добавите свои узлы в цикл, предыдущие не будут удалены. Они займут место в памяти и снизят вашу производительность.

Что делать вместо этого? Это очень просто, повторно инициализируйте ваши веса и повторно используйте те же узлы. Ваш код не сильно изменится, просто переместите генерацию образца вниз с помощью цикла for и определите функцию для повторной инициализации.

Я также взял второй цикл for вниз и просто увеличил номер эпохи до 10, вы можете вернуть его обратно, если у вас есть причина, чтобы он там был.

def reset_weights(model):
    session = K.get_session()
    for layer in model.layers: 
        if hasattr(layer, 'kernel_initializer'):
            layer.kernel.initializer.run(session=session)

x = Input(batch_shape=(n_batch, xx.shape[1]))
x = Dense(20)(x)
x = LeakyReLU(alpha=0.001)(x)
y = Dense(1)(x)
y = LeakyReLU(alpha=0.001)(y)
model = Model(inputs=x, outputs=y) 
model.compile(loss='mean_squared_error', optimizer='Adam', metrics=['accuracy'])
for q in range(10):
    #generate some samples
    model.fit(x, y, epochs=10, batch_size=n_batch, verbose=1, shuffle=False)
    model.reset_states()
    reset_weights(model)

Спасибо, Мете Хан. чтобы повторно инициализировать Wiegths LSTM, мне нужно включить if hasattr (layer, 'recurrent_initializer'): layer.recurrent_initializer.run (session = session)? Также я получаю эту ошибку, AttributeError: объект 'VarianceScaling' не имеет атрибута 'run'

Mika 26.10.2018 19:30

Вам нужно запустить инициализатор для сброса ваших весов, для повторяющегося инициализатора вы можете посмотреть: keras.io/layers/recurrent

Mete Han Kahraman 30.10.2018 06:42

Другие вопросы по теме