为什么培训期间Keras Conv1D权重没有改变?

时间:2019-04-03 08:45:49

标签: python keras

我仅使用一个卷积层(8个长度为10的滤波器)来初始化我的网络。

# Initialize Convolutional Neural Network
cnn = Sequential()
conv = Conv1D(filters=8, kernel_size=10, strides=1, padding="same", input_shape=(train.values.shape[1]-1, 1))
cnn.add(conv)
cnn.add(Activation("relu"))
cnn.add(MaxPooling1D(pool_size=2, strides=2, padding="same"))
cnn.add(Flatten())
cnn.add(Dense(2, activation='softmax'))
cnn.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
cnn.summary()

我在训练之前和训练后都进行一次权重训练,并使用我编写的函数对其进行绘制。

w1 = conv.get_weights()[0][:, 0, :]
print(w1[:,0])
plot_weights(w1)

# Fit CNN
y = to_categorical(train.values[:, -1])
X_cnn = np.expand_dims(train.values[:, :-1], axis=2)
start = time.time()
cnn.fit(X_cnn, y, verbose=1, batch_size=20, validation_split=0.2, epochs=20)
end = time.time()

w2 = conv.get_weights()[0][:, 0, :]
print(w2[:,0])
plot_weights(w2)

绘制权重的功能:

def plot_weights(w):
    w_min = w.min()
    w_max = w.max()
    n = w.shape[0]
    fig, axes = plt.subplots(nrows=8, ncols=1)
    for i, ax in enumerate(axes.flat):
        im = ax.imshow(w[:, i].reshape(1, n), vmin=w_min, vmax=w_max, interpolation="nearest",
                       cmap="gray")  # Display weights as image
        plt.setp(ax.get_yticklabels(), visible=False)  # Hide y ticks
        ax.tick_params(axis='y', which='both', length=0)  # Set length of y ticks to 0

    fig.colorbar(im, ax=axes.ravel().tolist())
    plt.show(block=False)

    return

输出看起来像这样:

Before training

After training

当我在训练前后打印第一个过滤器时,您还可以看到它是完全相同的数字(甚至没有稍微改变)。

>>>[-0.20076838  0.03835052 -0.04454999 -0.20220913  0.24402907  0.03407234
 -0.09768075  0.16887552  0.12767741  0.00756356]
>>>[-0.20076838  0.03835052 -0.04454999 -0.20220913  0.24402907  0.03407234
 -0.09768075  0.16887552  0.12767741  0.00756356]

此行为的原因是什么?难道我做错了什么?网络显然正在学习一些东西,因为我的准确率接近100%。

-ga97dil

1 个答案:

答案 0 :(得分:1)

您可能需要访问正在训练的模型本身,即cnn,而不是用来初始化层的定义即conv

尝试使用cnn.layers[0].get_weights()[:, 0, :]代替conv.get_weights()[0][:, 0, :]