创建一个简单的TensorFlow Keras.sequential模型,并接收所有的结果,都是相同的类。

问题描述 投票:0回答:1

我正试图创建一个顺序模型,将随机的向量组划分为一个类别。这个模型可以将所有的组一致地分类到同一个类。

创建数据。每条新闻有200个随机向量,维度为300,我想让模型能够将每个新闻组归入一个类。

 allnews=[]
for j in range(50):
        news=[]
        for i in range(200):
         news.append(np.random.random(300))
        allnews.append(np.array(news))   



#allnews= tf.convert_to_tensor(allnews)
allnews= np.array(allnews)

print(np.shape(allnews))
allnews = allnews.reshape((allnews.shape[0], allnews.shape[1], 300))
print(np.shape(allnews))

lables=[]
for j in range(20):
        lables.append(0)
for j in range(20):
        lables.append(1)
for d in range(10):
        lables.append(2)

lables= tf.convert_to_tensor(lables)
print(lables)

创建模型。我正在尝试创建的模型。

YourSequenceLenght=200

model = tf.keras.Sequential()
model.add(Input(shape=(YourSequenceLenght,300)))
model.add(Dense(300,use_bias=False,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l1(0.01),activation="linear"))
model.add(SimpleRNN(1, return_sequences=False,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l1(0.01),use_bias=False,recurrent_regularizer=tf.keras.regularizers.l1(0.01),activation="sigmoid"))
model.add(Dense(3,use_bias=False,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l1(0.01),activation="softmax"))

model.summary() 


METRICS = [
      keras.metrics.TruePositives(name='tp'),
      keras.metrics.FalsePositives(name='fp'),
      keras.metrics.TrueNegatives(name='tn'),
      keras.metrics.FalseNegatives(name='fn'), 
      keras.metrics.BinaryAccuracy(name='accuracy'),
      keras.metrics.Precision(name='precision'),
      keras.metrics.Recall(name='recall'),
      keras.metrics.AUC(name='auc'),
]


model.compile(optimizer='sgd',loss='categorical_crossentropy',metrics=METRICS)

训练和预测:

print(lables)
lables = keras.utils.to_categorical(y=lables,num_classes= 3)
   # y_train = np_utils.to_categorical(y=y_train, num_classes=10)

print(lables)


history = model.fit(allnews,lables,epochs=10)
res= model.predict(allnews)

print(np.shape(res))
import operator
for r in res:
  index, value = max(enumerate(r), key=operator.itemgetter(1))
  print(index)
  print(value)

for r in res:
  print(r)

训练和预测: 从打印的输出。

2
0.34069243
2
0.34070647
2
0.33907583
2
0.34005642
2
0.34013948
2
0.34007362
2
0.34028214
2
0.33997294
2
0.34018084
2
0.33995336
2
0.33998552
2
0.33882195
2
0.3401062
2
0.3418465
2
0.33978543
2
0.3396516
2
0.34062216
2
0.3419327
2
0.34114555
2
0.34119973
2
0.3404259
2
0.33981207
2
0.34035686
2
0.34139898
2
0.3398025
2
0.3391234
2
0.34051093
2
0.34120804
2
0.34140897
2
0.34064025
2
0.34133258
2
0.34019342
2
0.3404882
2
0.33930022
2
0.3416659
2
0.3406455
2
0.34054703
2
0.34057957
2
0.3391579
2
0.3395657
2
0.34069654
2
0.3400011
2
0.338789
2
0.34008256
2
0.34080264
2
0.34000066
2
0.340322
2
0.341806
2
0.34178147
2
0.34078327

EDIT:

澄清

我正在尝试使用一个模型,其工作原理如下。sigmoid隐藏层(带复活功能)和softmax投影。

tensorflow keras recurrent-neural-network sequential softmax
1个回答
0
投票

你正试图从随机数据中学习一些东西。你的模型是(随机)初始化的,它总是预测类2,梯度更新不会将权重引导到任何特定的方向,因为输入是随机的,所以它们留在那里。试着让你的输入数据是结构化的,而不是随机的(例如 random.random()*tf.one_hot(1,depth=200) 对于类1。random.random()*tf.one_hot(2, depth=200) 2级和 random.random()*tf.one_hot(3, depth=200). 现在,你的值仍然是随机的,但会坚持一个结构。

编辑:我看了一下你的colab::

我看了一下你的colab:

1)你可以通过在数据集中添加 .numpy() 之后 tf.one_hot: tf.one_hot(1).numpy().

2)当我把模型改为:

model = tf.keras.Sequential()
model.add(Input(shape=(YourSequenceLenght,300)))
model.add(tf.keras.layers.Flatten())
model.add(Dense(300,use_bias=False,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l1(0.01),activation="linear"))
# model.add(SimpleRNN(1, return_sequences=False,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l1(0.01),use_bias=False,recurrent_regularizer=tf.keras.regularizers.l1(0.01),activation="sigmoid"))
model.add(Dense(3,use_bias=False,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l1(0.01),activation="softmax"))

model.summary() 

准确率很快就变成了100% 在4个纪元后。我想是因为你的输出神经元只有1个。SimpleRNN,你不能编码足够的信息,它应该是什么类,至少不能只用1个 Dense 层后。

3) 您使用的是 BinaryAccuracy 在你的指标中,这在这里没有太大意义。你可以只使用正常的 accuracy (作为一个字符串)的精度度量 (metrics = ["accuracy", tf.keras.metrics.TruePositives(...), ...])

© www.soinside.com 2019 - 2024. All rights reserved.