我仅使用一个卷积层(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
答案 0 :(得分:1)
您可能需要访问正在训练的模型本身,即cnn
,而不是用来初始化层的定义即conv
。
尝试使用cnn.layers[0].get_weights()[:, 0, :]
代替conv.get_weights()[0][:, 0, :]
。