import numpy as np import pandas as pd from keras.models import Sequential from keras.layers import Conv1D, MaxPooling1D, Dense, Flatten # 加载数据 data = pd.read_csv('3c_left_1-6.csv') # 将数据转换为三维时序信号 x = data.iloc[:, 0:3].values x = x.reshape(x.shape[0], x.shape[1], 1) # 添加噪声 noise = np.random.normal(0, 1, x.shape) x_noise = x + noise # 构建模型 model = Sequential() model.add(Conv1D(32, kernel_size=3, activation='relu', input_shape=(3, 1))) model.add(Conv1D(64, kernel_size=3, activation='relu')) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dense(3)) # 编译模型 model.compile(loss='mse', optimizer='adam') # 训练模型 model.fit(x_noise, x, epochs=50, batch_size=32) # 预测结果 x_pred = model.predict(x_noise) # 计算SNR、MSE、PSNR snr = 10 * np.log10(np.sum(x ** 2) / np.sum((x - x_pred) ** 2)) mse = np.mean((x - x_pred) ** 2) psnr = 10 * np.log10((np.max(x) ** 2) / mse) # 保存结果 result = pd.DataFrame({'SNR': [snr], 'MSE': [mse], 'PSNR': [psnr]}) result.to_csv('result.csv', index=False)报错 File "G:\project2\gaussian.py", line 20, in <module> model.add(Conv1D(64, kernel_size=3, activation='relu'))ValueError: Negative dimension size caused by subtracting 3 from 1 for 'conv1d_2/convolution' (op: 'Conv2D') with input shapes: [?,1,1,32], [1,3,32,64].
时间: 2023-06-15 22:05:08 浏览: 181
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
这错误是因为第二个卷积层的输入形状不匹配。第一个卷积层的输出形状是 (batch_size, 1, 32),这意味着每个样本都是一个长度为 1 的序列,有 32 个特征。第二个卷积层的卷积核大小为 3,如果应用这个卷积核,每个样本的长度将减少 2,因此输出形状将变成 (batch_size, -2, 64),其中 -2 是负数。这就是为什么会出现“负维度尺寸”的错误。
要解决这个问题,你可以在第一个卷积层之后添加一个池化层,以减小特征图的大小。例如,你可以添加一个 MaxPooling1D 层,将特征图的长度减半,这样第二个卷积层的输入形状将变成 (batch_size, 1, 64)。
修改后的代码如下:
```
import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Conv1D, MaxPooling1D, Dense, Flatten
# 加载数据
data = pd.read_csv('3c_left_1-6.csv')
# 将数据转换为三维时序信号
x = data.iloc[:, 0:3].values
x = x.reshape(x.shape[0], x.shape[1], 1)
# 添加噪声
noise = np.random.normal(0, 1, x.shape)
x_noise = x + noise
# 构建模型
model = Sequential()
model.add(Conv1D(32, kernel_size=3, activation='relu', input_shape=(3, 1)))
model.add(MaxPooling1D(pool_size=2))
model.add(Conv1D(64, kernel_size=3, activation='relu'))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(3))
# 编译模型
model.compile(loss='mse', optimizer='adam')
# 训练模型
model.fit(x_noise, x, epochs=50, batch_size=32)
# 预测结果
x_pred = model.predict(x_noise)
# 计算SNR、MSE、PSNR
snr = 10 * np.log10(np.sum(x ** 2) / np.sum((x - x_pred) ** 2))
mse = np.mean((x - x_pred) ** 2)
psnr = 10 * np.log10((np.max(x) ** 2) / mse)
# 保存结果
result = pd.DataFrame({'SNR': [snr], 'MSE': [mse], 'PSNR': [psnr]})
result.to_csv('result.csv', index=False)
```
阅读全文