電影評論二分類問題

2021-09-28 12:49:27 字數 4600 閱讀 9834

jyupter notebook上編寫

from tensorflow.python.keras.datasets import imdb

import numpy as np

(train_data, train_labels)

,(test_data, test_labels)

= imdb.load_data(num_words=

10000

)# num_words=10000 單詞的索引最大不會超過10000,只選取常用單詞的前10000個

print

(train_data.shape,

'\n'

)print

(train_data[0]

, end='')

print

('\n'

)print

(train_labels[0]

)print

('\n'

)print

(max([

max(sequence)

for sequence in train_data]))

# 最大單詞的索引只到9999

"""準備資料:

不能將整數序列直接輸入神經網路,需要將列表轉化為張量。

(1)填充列表,使其具有相同的長度,再將列表轉化為(samples,word_indices))

(2)one-hot編碼,將列表轉化為0,1組成的向量

這裡採用(2)"""

import numpy as np

defvectorize_sequences

(sequences, dimension=

10000):

results = np.zeros(

(len

(sequences)

, dimension)

)# 建立乙個形狀為(len(sequenses), dimension))的零矩陣

for i, sequence in

enumerate

(sequences)

: results[i, sequence]=1

# 將results的指定索引設定為1

return results

x_train = vectorize_sequences(train_data)

# 訓練資料向量化

x_test = vectorize_sequences(test_data)

# 測試資料向量化

x_train[0]

# one-hot化了

"""標籤向量化,標籤值本來就是0,1"""

t_train = np.asarray(train_labels)

.astype(

'float32'

)t_test = np.asarray(test_labels)

.astype(

'float32'

)# 現在可以將資料輸入到神經網路裡了

"""構建網路"""

from tensorflow.python.keras import layers

from tensorflow.python.keras import models

from tensorflow.python.keras import optimizers

from tensorflow.python.keras import losses

from tensorflow.python.keras import metrics

model = models.sequential(

)model.add(layers.dense(

16, activation=

'relu'

, input_shape=

(10000,)

))model.add(layers.dense(

16, activation=

'relu'))

model.add(layers.dense(

1, activation=

'sigmoid'))

# 輸出乙個0~1的概率

model.

compile

(optimizer=

'rmsprop'

, loss=

'binary_crossentropy'

, metrics=

['accuracy'])

# 配置自定義的優化器 model.compile(optimizer=optimizers.rmsprop(lr=0.001), loss='binary_crossentropy', metrics=['accuracy'])

# model.compile(optimizer=optimizers.rmsprop(lr=0.001), loss=losses.binary_crossentropy, metrics=[metrics.binary_accuracy])

"""留出驗證集:

需要將原始訓練資料留出10000個樣本作為驗證集"""

x_val = x_train[

:10000

]partial_x_train = x_train[

10000:]

t_val = t_train[

:10000

]partial_t_train = t_train[

10000

:]

"""訓練模型

history是乙個字典"""

model.

compile

(optimizer=

'rmsprop'

, loss=

'binary_crossentropy'

, metrics=

['acc'])

history = model.fit(partial_x_train,

partial_t_train,

epochs=20,

batch_size=

512,

validation_data=

(x_val, t_val)

)# x_val訓練集,t_val驗證集

history_dict = history.history

print

(history_dict.keys(

))

"""繪製訓練損失和驗證損失"""

import matplotlib.pyplot as plt

history_dict = history.history

loss_values = history_dict[

'loss'

]val_loss_values = history_dict[

'val_loss'

]epochs =

range(1

,len

(loss_values)+1

)plt.plot(epochs, loss_values,

'bo'

, label=

'training loss'

)# 'bo'代表藍色圓圈

plt.plot(epochs, val_loss_values,

'b', label=

'validation loss'

)# 'b'代表藍色實線

plt.xlabel(

'epochs'

)plt.ylabel(

'loss'

)plt.title(

'訓練損失和驗證損失'

)plt.legend(

)plt.show(

)# 結果過擬合了

"""繪製訓練精度和驗證精度"""

acc = history_dict[

'acc'

]val_acc = history_dict[

'val_acc'

]plt.plot(epochs, acc,

'bo'

, label=

'training acc'

) plt.plot(epochs, val_acc,

'b', label=

'validation acc'

) plt.title(

'training and validation accuracy'

) plt.xlabel(

'epochs'

) plt.ylabel(

'accuracy'

) plt.legend(

)plt.show(

)# 過擬合

"""使用訓練好的網路在新資料上生成**結果"""

model.predict(x_test)

# 有些分了結果非常確信,有些則不那麼確信

AI 神經網路IMDB電影評論二分類模型訓練和評估

import keras from keras.layers import dense from keras import models from keras import optimizers from keras.datasets import imdb from keras import lo...

二分類問題

模型 帶有relu啟用的dense層堆疊 對於二分類問題,網路的最後一層應該是只有乙個單元並使用sigmoid啟用的dense層,網路的輸出應該是0 1的標量,表示概率值 對於二分類問題的sigmoid標量輸出,應該使用binary crossentroy 二元交叉熵 損失函式 實驗 1 嘗試增加或...

二分類問題

深度學習中的基本問題就是這個,上午我還達到90 85 的acc,現在只有76 臥槽,我動 了啊?有鬼。明明沒怎麼改引數,卻再也回不到過去,這個trick不小啊。既然回不到過去,不妨重新開始吧。我套了一下vgg,發現網路太深了,根本跑不動,效果也不好,減少網路後,acc反而有提高,之前我還以為驗證集有...