Почему веса Keras Conv1D не меняются во время тренировки? - PullRequest
1 голос
/ 03 апреля 2019

Я инициализирую свою сеть только одним Сверточным слоем (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

Вывод выглядит так:

Перед тренировкой

После тренировки

Когда я печатаю первый фильтр до и после тренировки, вы также можете видеть, что это те же самые цифры (даже не слегка измененные).

>>>[-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 Ответ

1 голос
/ 03 апреля 2019

Вам может потребоваться доступ к самой модели, которая обучается, т. Е. cnn, а не к определению, которое вы используете для инициализации слоя, т.е. conv.

Попробуйте cnn.layers[0].get_weights()[:, 0, :] вместо conv.get_weights()[0][:, 0, :].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...