当前位置: 首页 > 知识库问答 >
问题:

Conv1D不更新权重。(全零)和测试输出始终相同,等于最后一层权重?

栾瑞
2023-03-14

我想用1D CNN来预测第二天的太阳能。时间序列数据分辨率为一小时,长度为一年。我正在用第一天的数据训练模型,以预测第二天。xtrain=第1天,ytrain=第2天,xtest=第3天,以预测第4天。

24小时数据输入-

我对数据进行了10天的培训(样本);然后提前4天预测,问题是CNN总是给出相同的输出值,无论输入是什么。然后,我检查了权重,只有输出层权重为非零。此外,输出值不会随输入集的不同而变化。

数据链接:https://mega.nz/#哦!NpoTzIBJ!U5l8ToQgcJ6xif2tMjIrXuace3skhrtwLEdeoWe\U FkM

代码:

import pandas
from pandas import Series
from pandas import DataFrame
import keras
from keras.callbacks import ModelCheckpoint
from sklearn.metrics import r2_score
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, regularizers, initializers
from keras.layers import Conv1D,  MaxPooling1D, Flatten, AveragePooling1D
from keras.activations import *
from keras.losses import *
from keras.optimizers import *
from keras.utils import plot_model
from keras.models import Sequential
from keras.utils import plot_model
import numpy as np
import matplotlib.pyplot as plt
from sklearn import preprocessing
from numpy import zeros, newaxis
from keras.callbacks import EarlyStopping
import sklearn.metrics
from sklearn.metrics import mean_squared_error
from math import sqrt

data = pandas.read_csv("meas.csv", header=0)
dataset = data.values[:,1]

all_pred_data = []
ytest_all = []

model = Sequential()
model.add(Conv1D(3,kernel_size=3,activation='relu', input_shape=xtrain.shape[1:3],kernel_initializer=initializers.RandomUniform(minval=-1, maxval=1),kernel_regularizer=regularizers.l2(0.1))) #input_shape=()
model.add(AveragePooling1D(pool_size=3))
model.add(Conv1D(3,kernel_size=3,activation='relu', input_shape=xtrain.shape[1:3],kernel_initializer=initializers.RandomUniform(minval=-1, maxval=1),kernel_regularizer=regularizers.l2(0.1))) #input_shape=()
model.add(AveragePooling1D(pool_size=3))
model.add(Flatten())
model.add(Dense(42,activation='tanh',kernel_regularizer=regularizers.l2(0.1),kernel_initializer=initializers.RandomUniform(minval=-1, maxval=1)))
model.add(Dense(24, activation='linear',kernel_regularizer=regularizers.l2(0.1),kernel_initializer=initializers.RandomUniform(minval=-1, maxval=1)))

model.compile(loss='mse',
          optimizer=keras.optimizers.Adam(),
          metrics=['mae','accuracy'])


for i in range(0,10-1,1): 

    xtrain = dataset[24*(i+1)-24:24*(i+1)]
    ytrain = dataset[24*(i+1):24*(i+2)]

    xtrain = xtrain.reshape(1,24,1)
    ytrain = ytrain.reshape(1,24)

    model.fit(xtrain,ytrain,epochs=500,verbose=2) 


# TEST
for i in range(20,25-1,1):
    xtest = dataset[24*(i+1):24*(i+2)] #(i+1):(i+6+1)
    ytest = dataset[24*(i+2):24*(i+2)+24]

    xtest = xtest.reshape(1,xtrain.shape[1], 1)

    pred_data = np.round(model.predict(xtest),3)

    pred_data_transpose = pred_data.transpose()

    all_pred_data.extend(pred_data_transpose)
    ytest_all.extend(np.round(ytest,3))

共有1个答案

丁雅逸
2023-03-14

如果权重全部为0,它们将永远不会改变,因为梯度将始终为0,为了避免这种情况,请尝试规范化您的数据,从而更容易训练网络,如果规范化输入数据还不够,请尝试使用batch_normalization

 类似资料:
  • 我需要使用嵌入层来编码单词向量,所以嵌入层的权重本质上是单词向量。显然,我不希望这种情况下的权重在反向传播期间被更新。我的问题是,如果按设计嵌入层已经禁止重量更新,或者我必须对此做一些特别的事情?

  • 我正在开发一个需要ML模型集成的Android应用程序。为此,我使用TensorFlow lite进行部署。我使用基于自定义模型的暹罗网络进行输出,输出形状为[1 128]。当我在Google Colab上推断python中的tf lite模型时,输出[1 128]数字与我在Android设备上产生的数字不同。输入图像在两种推断以及输入和输出形状上都是相同的,但我在Android手机和Python

  • 我已经通读了我能在错误信息上找到的每一篇文章: 你没有访问/在这个服务器上的权限。 我甚至不知道应该包括哪些信息。绝对是个新手。这是我所知道的。我正在运行Apache/2.4。16台Mac OSX优胜美地。一度http://localhost返回“它工作!”。然后我转到/etc/apache2,打开文件httpd。conf并从以下行中删除#(使用MacRabbit Espresso): LoadM

  • 问题内容: 我正在尝试转学;为此,我想删除神经网络的最后两层并添加另外两层。这是一个示例代码,它也会输出相同的错误。 我使用删除了该图层,但是当我尝试添加其输出时出现此错误 AttributeError:“模型”对象没有属性“添加” 我知道该错误的最可能原因是不当使用。我应该使用其他什么语法? 编辑: 我试图在keras中删除/添加图层,但不允许在加载外部重物后添加它。 它显示此错误 问题答案:

  • 本文向大家介绍tensorflow输出权重值和偏差的方法,包括了tensorflow输出权重值和偏差的方法的使用技巧和注意事项,需要的朋友参考一下 使用tensorflow 训练模型时,我们可以使用 tensorflow自带的 Save模块 tf.train.Saver()来保存模型,使用方式很简单 就是在训练完模型后,调用saver.save()即可 重新载入模型 但是这种方式保存的模型中包含特