【问题标题】:why is the accuracy constant but loss does change?为什么准确度不变但损失确实发生了变化?
【发布时间】:2020-11-08 07:46:48
【问题描述】:

正如您在下面看到的,我有两个函数,get_data() 输出所选资产历史记录的数据框并将其传递给train_model() 一切正常,但随着模型训练,准确性似乎并没有改变损失确实会下降,但在第二个 epoch 之后准确度保持不变,当训练 1000 个 epoch 时,准确度也不会改变

我尝试使用此代码更改的内容:

  1. 更改每个 LSTM 层的单元数
  2. 尝试使用来自不同来源的不同数据帧 (alpha-vantage)
  3. 改变纪元计数

不幸的是,没有任何改变

def train_model( df):

    if not os.path.exists("/py_stuff/"):
        os.makedirs("/py_stuff/")


    checkpoint_filepath ="/py_stuff/check_point"
    weights_checkpoint = "/py_stuff/"


    checkpoint_dir = os.path.dirname(checkpoint_filepath)


    model_checkpoint_callback = tf.keras.callbacks.ModelCheckpoint(
        filepath=checkpoint_filepath,
        save_weights_only=True,
        monitor='accuracy',
        mode='max',
        save_best_only=True,
        verbose=1)


    dataset_train = df
    training_set = dataset_train.iloc[:, 1:2].values

    sc = MinMaxScaler(feature_range=(0,1))
    training_set_scaled = sc.fit_transform(training_set)

    X_train = []
    y_train = []
    for i in range(100, len(df)):
        X_train.append(training_set_scaled[i-100:i, 0])
        y_train.append(training_set_scaled[i, 0])
    X_train, y_train = np.array(X_train), np.array(y_train)
    X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))


    model = Sequential()
    model.add(LSTM(units = 100, return_sequences = True, input_shape = (X_train.shape[1], 1)))
    model.add(Dropout(0.2))

    model.add(LSTM(units=100 ,  return_sequences=True))
    model.add(Dropout(0.2))
    model.add(LSTM(units=100 , return_sequences=True))
    model.add(Dropout(0.2))
    model.add(LSTM(units=100))
    model.add(Dropout(0.2))
    model.add(Dense(units=1))
    model.compile(optimizer='adam', loss='mean_squared_error' , metrics=['accuracy'])

        ## loading weights 

    try:
        model.load_weights(checkpoint_filepath)
        print ("Weights loaded successfully $$$$$$$ ")
    except:
        print ("No Weights Found !!! ")



    model.fit(X_train,y_train,epochs=50,batch_size=100, callbacks=[model_checkpoint_callback])

    ## saving weights 


    try:
        model.save(checkpoint_filepath)
        model.save_weights(filepath=checkpoint_filepath)

        print ("Saving weights and model done ")

    except OSError as no_model:
        print ("Error saving weights and model !!!!!!!!!!!! ")





def get_data(CHOICE):
        data = yf.download(  # or pdr.get_data_yahoo(...
        # tickers list or string as well
                tickers = CHOICE,

        # use "period" instead of start/end
        # valid periods: 1d,5d,1mo,3mo,6mo,1y,2y,5y,10y,ytd,max
        # (optional, default is '1mo')
                period = "5y",

        # fetch data by interval (including intraday if period < 60 days)
        # valid intervals: 1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo
        # (optional, default is '1d')
                interval = "1d",

        # group by ticker (to access via data['SPY'])
        # (optional, default is 'column')
                group_by = 'ticker',

        # adjust all OHLC automatically
        # (optional, default is False)
                auto_adjust = True,

        # download pre/post regular market hours data
        # (optional, default is False)
                prepost = True,

        # use threads for mass downloading? (True/False/Integer)
        # (optional, default is True)
                threads = True,

        # proxy URL scheme use use when downloading?
        # (optional, default is None)
                proxy = None
        )

        dff = pd.DataFrame(data)
        return dff





df = get_data(CHOICE="BTC-USD")



train_model(df)

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    您正在处理一个精度未定义的回归问题

    准确率定义为属于特定类别的概率。例如,输出为数字 9 的概率。类的数量是有限的(或可数的)。

    在您的情况下,您的网络输出一个实数。在这种情况下,准确性的概念没有任何意义。

    例如,您的输出为 1.000 的概率为 0。尽管(而且令人惊讶!),概率为零并不意味着事件永远不会发生!

    理想情况下,Keras 应该返回一个错误,指出accuracy not defined

    【讨论】:

      【解决方案2】:

      从您的损失函数看来,您有一个回归网络。您的损失是均方误差,度量精度对回归网络没有任何意义。准确度指标仅在用于分类模型时才有意义。因此,您可以从编译代码中删除 metrics=['accuracy'] 并使用损失值来评估您的模型。因此,如果损失在减少,则意味着您的优化器正在成功地训练网络。

      【讨论】:

      • 如何使用model.evaluate()显示模型准确率,它预测的与特定时间的原始值相比有多接近?
      • 您必须保留一部分训练数据用于测试。完成训练后,使用您的测试集来评估模型。如果您从文件加载模型,则必须在评估之前使用 mean_squared_error 或 mean_absolute_error 编译模型。 mean_squared_error 的值将告诉您模型在测试集上的表现。例如,如果您正在预测某物的价格并使用 mean_absolute_error 并且 MAE 值为 1,这意味着测试集上的模型误差平均为 1$。 1$ 错误是否大取决于您的应用程序。
      • 在一个类中考虑上面的两个函数,作为方法,我保存模型,df 作为self.item = item ,这样我就可以从对象中获取数据并将其传递给其他方法
      • 我必须在model_checkpoint_callback 中更改什么,因为我收到此警告WARNING:tensorflow:Can save best model only with val_loss available, skipping.
      猜你喜欢
      • 2020-11-06
      • 1970-01-01
      • 2020-01-06
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多