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