把我之前的代码添加激活函数可视化
时间: 2023-07-05 15:34:03 浏览: 124
好的,以下是在你之前的代码中添加激活函数可视化的修改:
```python
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv1D, MaxPooling1D, Activation
from keras import backend as K
# 生成正弦函数数据
x = np.linspace(0, 100, 1000)
y = np.sin(2*x)
# 将数据转换为卷积神经网络需要的格式
X = np.zeros((len(x), 10))
for i in range(len(x)):
for j in range(10):
X[i][j] = y[(i+j)%len(x)]
X = np.reshape(X, (X.shape[0], X.shape[1], 1))
# 构建卷积神经网络模型
model = Sequential()
model.add(Conv1D(filters=32, kernel_size=3, activation='relu', input_shape=(10,1)))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100))
model.add(Activation('relu'))
model.add(Dense(1, activation='linear'))
# 打印模型结构
model.summary()
# 编译模型
model.compile(loss='mse', optimizer='adam')
# 训练模型并可视化损失函数
history = model.fit(X, y, epochs=100, batch_size=32, validation_split=0.2)
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(loss)+1)
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
# 预测并可视化结果
y_pred = model.predict(X)
plt.plot(x, y, label='true')
plt.plot(x, y_pred, label='predict')
plt.legend()
plt.show()
# 定义一个函数,用于获取卷积层的输出
get_conv_output = K.function([model.layers[0].input], [model.layers[0].output])
# 获取卷积层的输出
conv_output = get_conv_output([X])[0]
# 将输出可视化
plt.figure(figsize=(10, 10))
for i in range(32):
plt.subplot(4, 8, i+1)
plt.imshow(np.squeeze(conv_output[:, :, i]), cmap='gray')
plt.show()
# 定义一个函数,用于获取激活函数层的输出
get_activation_output = K.function([model.layers[0].input], [model.layers[3].output])
# 获取激活函数层的输出
activation_output = get_activation_output([X])[0]
# 将输出可视化
plt.figure(figsize=(10, 10))
for i in range(32):
plt.subplot(4, 8, i+1)
plt.imshow(np.squeeze(activation_output[:, :, i]), cmap='gray')
plt.show()
```
我在原有的代码中添加了一个激活函数层,并使用 `Activation('relu')` 指定了激活函数为 ReLU。然后,在获取卷积层输出的代码下面,我添加了获取激活函数层输出的代码,并将其可视化为图片的形式。
需要注意的是,在使用 `imshow` 函数可视化激活函数层输出时,需要将其先转换为二维数组的形式,因为它只有一个通道。具体地,我使用了 `np.squeeze` 函数将其从三维数组的形式转换为二维数组的形式。
阅读全文