import numpy as np import matplotlib.pyplot as plt from keras.models import Sequential from keras.layers import Dense, Flatten, Conv1D, MaxPooling1D 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, 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() # 构建一个新的模型,仅保留第一层 Conv1D,激活函数可视化 activation_model = Sequential() activation_model.add(Conv1D(filters=32, kernel_size=3, activation='relu', input_shape=(10,1))) # 获取该层的输出 activations = activation_model.predict(X) # 可视化输出 plt.figure(figsize=(15, 5)) for i in range(32): plt.subplot(4, 8, i+1) plt.plot(activations[0, :, i]) plt.show() # 获取卷积层的权重 weights, biases = model.layers[0].get_weights() # 可视化卷积核 plt.figure(figsize=(15, 5)) for i in range(32): plt.subplot(4, 8, i+1) plt.plot(weights[:, :, i].flatten()) plt.show()详细解释代码
时间: 2024-04-26 21:23:00 浏览: 228
Matplotlib.pyplot 三维绘图的实现示例
这段代码实现了一个简单的卷积神经网络模型,用于对一个正弦函数进行拟合,并可视化模型的结构、损失函数、预测结果、卷积层的输出、卷积核和激活函数。
具体解释如下:
1. 导入必要的库:numpy、matplotlib、keras。
2. 生成正弦函数数据:使用numpy的linspace函数生成0到100之间的1000个等间距的数,作为x值,再计算对应的sin(2x)的值作为y值。
3. 将数据转换为卷积神经网络需要的格式:将y值顺序循环移位10次,并将每10个y值作为一个样本,最终得到一个形状为(1000, 10, 1)的输入数据X。
4. 构建卷积神经网络模型:使用Sequential模型,先加入一个Conv1D层,包含32个3x1的卷积核,使用ReLU激活函数,输入形状为(10, 1)。然后加入一个MaxPooling1D层,使用大小为2的池化核。接着加入一个Flatten层,将卷积层的输出展平。再加入一个Dense层,包含100个神经元,使用ReLU激活函数。最后加入一个Dense层,包含1个神经元,使用线性激活函数,输出预测结果。
5. 打印模型结构:使用summary方法打印模型结构信息。
6. 编译模型:使用compile方法编译模型,指定损失函数为均方误差,优化器为Adam。
7. 训练模型并可视化损失函数:使用fit方法训练模型,指定训练数据X和y,迭代100次,每次使用32个样本进行训练,验证集占比20%。训练完成后,使用matplotlib可视化训练集和验证集的损失函数。
8. 预测并可视化结果:使用predict方法对所有样本进行预测,然后使用matplotlib可视化真实值和预测值的对比。
9. 获取卷积层的输出:使用Keras的backend模块,定义一个函数get_conv_output,用于获取卷积层的输出。然后使用该函数获取卷积层的输出,并使用matplotlib可视化所有卷积核的输出。
10. 构建一个新的模型,仅保留第一层Conv1D,激活函数可视化:使用Sequential模型,仅加入第一层Conv1D层,然后使用predict方法获取该层的输出,并使用matplotlib可视化所有卷积核的激活函数。
11. 获取卷积层的权重:使用model.layers[0].get_weights()方法获取卷积层的权重。
12. 可视化卷积核:使用matplotlib可视化所有卷积核的权重。
阅读全文