我有这样的感觉
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分别重置和构建,编译和拟合神经网络?
答案 0 :(得分:1)
当使用keras或tensorflow制作图层时,tensorflow会在其图上添加一个或多个节点,每次添加优化器,损失函数或激活函数时,它都会执行相同的操作并为其添加节点。 / p>
当您调用model.fit()
时,tensorflow从其根开始执行其图。如果您在循环中添加节点,则先前的节点将不会被删除。它们会占用内存空间,并且会降低您的性能。
该怎么办?非常简单,重新初始化权重并重新使用相同的节点。您的代码不会有太大变化,只需使用for循环将样本生成向下移动并定义一个函数即可重新初始化。
我也花了第二个for循环,只是将纪元数增加到10,如果有理由可以将for循环放回去。
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)