神经网络给出TypeError:(’关键字参数不理解:’,’训练’)

原文标题neural network gives TypeError: (‘Keyword argument not understood:’, ‘training’)

我试图用张量流概率训练一个 fcnn 模型,但我得到一个我不明白的错误。神经网络是

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
import timeit
import tensorflow as tf
from tqdm import tqdm_notebook as tqdm
import tensorflow_probability as tfp
from tensorflow.keras.callbacks import TensorBoard
import datetime,os
tfd = tfp.distributions
from tensorflow.keras.layers import Dropout
from tensorflow.keras.layers import Input
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Adam

def normal_exp(params): 
  return tfd.Normal(loc=params[:,0:1], scale=tf.math.exp(params[:,1:2]))

def NLL(y, distr): 
  return -distr.log_prob(y) 

def create_model():
  return tf.keras.models.Sequential([
    Input(shape=(1,)),
    Dense(200,activation="relu"),
    Dropout(0.1, training=True),
    Dense(500,activation="relu"),
    Dropout(0.1, training=True),
    Dense(500,activation="relu"),
    Dropout(0.1, training=True),
    Dense(200,activation="relu"),
    Dropout(0.1, training=True),
    Dense(2),
    tfp.layers.DistributionLambda(normal_exp, name='normal_exp')
])
def train_model():
    model = create_model() 
    model.compile(Adam(learning_rate=0.0002), loss=NLL)
    logdir = os.path.join("logs", datetime.datetime.now().strftime("%Y%m    %d-%H%M%S"))
    tensorboard_callback = tf.keras.callbacks.TensorBoard(logdir, histogram_freq=1)
    model.fit(x= X_train, y =y_train, epochs=1500, validation_data=(X_val, y_val), callbacks=[tensorboard_callback])

train_model()

虽然错误说

`/usr/local/lib/python3.7/dist-packages/keras/utils/generic_utils.py in validate_kwargs(kwargs, allowed_kwargs, error_message)1172 for kwarg in kwargs:1173 if kwarg not in allowed_kwargs:-> 1174 raise TypeError(error_message, kwarg)11751176

TypeError: ('Keyword argument not understood:', 'training')`

我尝试修改在 Sequential() 中定义神经网络的方式,但我不知道问题出在哪里

原文链接:https://stackoverflow.com//questions/71672518/neural-network-gives-typeerror-keyword-argument-not-understood-training

回复

我来回复
  • I'mahdi的头像
    I'mahdi 评论

    Sequential API你不能使用trining=Truein层输入作为**kwargs。但是你可以像下面这样使用training=TrueinFunctional API

    x = Input(shape=(1,))
    x = Dense(200,activation="relu")(x)
    x = Dropout(0.1)(x, training=True)
    x = Dense(2)(x)
    out = tfp.layers.DistributionLambda(normal_exp, name='normal_exp')(x)
    

    您在Sequential API中的正确代码:

    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    from sklearn.model_selection import train_test_split
    import timeit
    import tensorflow as tf
    from tqdm import tqdm_notebook as tqdm
    import tensorflow_probability as tfp
    from tensorflow.keras.callbacks import TensorBoard
    import datetime,os
    tfd = tfp.distributions
    from tensorflow.keras.layers import Dropout
    from tensorflow.keras.layers import Input
    from tensorflow.keras.layers import Dense
    from tensorflow.keras.models import Model
    from tensorflow.keras.optimizers import Adam
    
    def normal_exp(params): 
      return tfd.Normal(loc=params[:,0:1], scale=tf.math.exp(params[:,1:2]))
    
    def NLL(y, distr): 
      return -distr.log_prob(y) 
    
    def create_model():
      return tf.keras.models.Sequential([
        Input(shape=(1,)),
        Dense(200,activation="relu"),
        Dropout(0.1),
        Dense(500,activation="relu"),
        Dropout(0.1),
        Dense(500,activation="relu"),
        Dropout(0.1),
        Dense(200,activation="relu"),
        Dropout(0.1),
        Dense(2),
        tfp.layers.DistributionLambda(normal_exp, name='normal_exp')
    ])
    def train_model():
        model = create_model() 
        model.compile(Adam(learning_rate=0.0002), loss=NLL)
        logdir = os.path.join("logs", datetime.datetime.now().strftime("%Y%m    %d-%H%M%S"))
        tensorboard_callback = tf.keras.callbacks.TensorBoard(logdir, histogram_freq=1)
        model.fit(x= X_train, y =y_train, epochs=2, validation_data=(X_val, y_val), callbacks=[tensorboard_callback])
    
        
    X_train = np.random.rand(10,1)
    y_train = np.random.rand(10)
    
        
    X_val = np.random.rand(10,1)
    y_val = np.random.rand(10)
    
    train_model()
    

    输出:

    Epoch 1/2
    1/1 [==============================] - 1s 1s/step - loss: 1.1478 - val_loss: 1.0427
    Epoch 2/2
    1/1 [==============================] - 0s 158ms/step - loss: 1.1299 - val_loss: 1.0281
    
    2年前 0条评论
  • saleh sargolzaee的头像
    saleh sargolzaee 评论

    这是因为Dropout图层没有training参数。使用model.fit时,training会自动适当地设置为True,而在其他情况下,您可以在调用层时将kwarg显式设置为True:

    tf.keras.layers.Dropout(0.2, noise_shape=None, seed=None)(dense, training=True)
    
    2年前 0条评论